Clase C, Apuntadores La memoria de la computadora • La memoria esta organizada en células (byte) en cuales se puede guardar información • Cada byte tiene su dirección (el número consecutivo en la memoria) • Cuando asignamos valor a una variable, este valor se escribe en los bytes que le corresponden. • El C permite el acceso a la dirección de la variable. Apuntadores (pointers) • Definición int q; /* variable tipo int */ int *ip; /* pointer de una variable int */ q = 5; /* asigna valor a la variable */ ip = &q; /* asigna la dirección de q al pointer */ int b = *ip; /* a la var. b se asigna el valor escrito en la dirección ip */ Apuntadores (pointers) • Uso. int q; /* variable tipo int */ int *ip, *iq; /* pointer de una variable int */ q = 5; /* asigna valor a la variable */ ip = &q; /* asigna la dirección de q al pointer */ iq = ip; /* iq y ip apuntan a misma variable */ int b = *iq; /* b = 5 */ *ip = 10; /* q = 10, b = 5 * • Definición & - extrae la dirección, * - el valor escrito a la dirección que apunta el pointer. Apuntadores y argumentos de las funciones • Ejercicio: Escribir una función que intercambia los valores de dos variables Apuntadores y argumentos de las funciones • Solución: void swap(int *a, int *b) { int tmp; tmp = *b; *b = *a; *a = tmp; } int f(int x) { x += 10; return x; } int main(void) { int a,b; a = 10; b = f(a); printf(%d %d\n”,a,b); } Funciones main() memoria usada por main aqui existen a y b b = f(a); el valor de a se asigna a x f(int x) memoria usada por f() desaparece cuando f() termina x existe solo aqui sus cambios NO se reflejan en main int f(int *x) { *x += 10; return *x; } void main() { int a,b; a = 10; b = f(&a); printf(%d %d\n”,a,b); } Funciones main() memoria usada por main aqui existen a y b b = f(&a); la dirección de a se asigna a x f(int *x) x contiene la dirección de la variable a y de tal forma f tiene acceso a la memoria de main. *x+=10; cambia el valor en la dirección x así cambia el valor de a int getint(int *pn) { int c, sign; while (isspace(c = getch())); /* skip white space */ if (!isdigit(c) && c != EOF && c != '+' && c != '-') { ungetch(c); /* it is not a number */ return 0; } sign = (c == '-') ? -1 : 1; if (c == '+' || c == '-') c = getch(); for (*pn = 0; isdigit(c), c = getch()) *pn = 10 * *pn + (c - '0'); *pn *= sign; if (c != EOF) ungetch(c); return c; } Ejercicios • Escribe función getfoat • Que valor debe de regresar esta función? Arreglos y apuntadores • Un vector es una cadena de bytes situada uno atrás de otro en la memoria • El nombre de un vector es apuntador al primer elemento. int a[10], *ip; ip = &a[0] y ip = a son equivalentes. • Indeces *(ip+5) es equivalente a a[5] • Comparación int *iq = a; iq < &a[5] es verdad /* strlen: return length of string s */ int strlen(char *s) { int n; for (n = 0; *s != '\0', s++) n++; return n; } /* strlen: return length of string s */ int strlen(char *s) { char *p = s; while (*p != '\0') p++; return p - s; } /* strcpy: copy t to s; array subscript version */ void strcpy(char *s, char *t) { int i; i = 0; while ((s[i] = t[i]) != '\0') i++; } /* strcpy: copy t to s; pointer version */ void strcpy(char *s, char *t) { int i; i = 0; while ((*s = *t) != '\0') { s++; t++; } } /* strcpy: copy t to s; pointer version 2 */ void strcpy(char *s, char *t) { while ((*s++ = *t++) != '\0') ; }