Clase C, Apuntadores

Anuncio
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')
;
}
Descargar