Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf ·...

25
Apuntadores Unidad 3 Primavera 2010 Dra. Ruth M. Aguilar Ponce

Transcript of Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf ·...

Page 1: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Apuntadores

Unidad 3

Primavera 2010

Dra. Ruth M. Aguilar Ponce

Page 2: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Contenido

Conceptos básicos

Declaración de apuntadores

Paso de apuntadores a funciones

Aritmética de apuntadores

Apuntadores y arreglos

Apuntadores multidimensionales

Apuntadores a funciones

Page 3: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Conceptos Básicos

� Una variable es un objeto con nombre y valor variable.

� int suma = 0

� nombre: suma, valor inicial: 0

� Una variable es almacenada en la memoria.

Memoria

� Cada variable requiere de un tamaño de memoria por ejemplo:

� int requiere de 4 bytes

� char requiere de 1 byte

sumadirección

Page 4: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Determine el tamaño de Variables

� La función sizeof(type) determina la cantidad de bytes requeridos para guardar una variable del tipo type

� Ejemplo:

#include <stdio.h>

#include <stdlib.h>

int main()

{

printf("Tamanio de char es %d\n", sizeof(char));

printf("Tamanio de int es %d\n", sizeof(int));

printf("Tamanio de float es %d\n", sizeof(float));

system("pause");

}

Page 5: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Declaración de variable

� La siguiente declaración le dice al compilador que requiere un espacio de memoria para almacenar un entero y que ese bloque estará asociado a la variable k

int k; k

� Cuando realizamos lo siguiente el compilador introduce el valor a ese bloque de memoria

k = 2; 2k

Page 6: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Definición

� Un apuntador es un variable que contiene la dirección de una bloque de memoria

� Un apuntador es declarado usando el operado *

tipo_dato *nombre_variable

� Ejemplo:� Ejemplo:

int *p

direcciónp

bloque de tamaño int

Page 7: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Operador de indirección (*) y dirección (&)

� El operador de dirección ( & ) nos permite tomar la dirección de la variable� Ejemplo: para obtener la dirección donde se encuentra almacenada la variable k debo usar lo siguiente

&k

� El operador de indirección (*) actúa sobre el apuntador permitiendo acceder a la variable que esta apuntando

� Ejemplo� int *p

� p permite definir la dirección a la cual apunta p

� *p permite acceder a la variable que apunta p

Page 8: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Operador de indirección (*) y dirección (&)

main(){

int k = 2;int *p;

p = &k; // p apunta a la variable k*p = *p + 1; // incrementa el valor de k

}

dirección de kp

2

}

k

Page 9: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Ejercicio

� Determina el valor de x, y, objeto apuntado por ip para cada linea del siguiente ejemplo

int x = 1, y = 2, z[10];

int * ip ;int * ip ;

ip = &x;

y = *ip;

*ip = 0;

ip = &z[0];

Page 10: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Solución

Código x y ip

valores iniciales 1 2 null

ip = &x; 1 2 x

y = * ip ; 1 1 xy = * ip ; 1 1 x

*ip = 0; 0 1 x

ip = &z[0]; 0 1 z[0]

Page 11: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Paso de Apuntadores a una Función

� El uso de apuntadores nos permite pasar los parámetros por referencia o por dirección

� Cuando pasamos un parámetro por referencia estamos pasando la dirección donde se encuentra ese elemento.

� La función tiene la capacidad de acceder al bloque de memoria donde se encuentra ese elemento y por lo tanto puede modificar dicho elemento.

� Los cambios hechos al valor de la variable dentro de la función se verán reflejados en la variable cuando la función a terminado su ejecución

Page 12: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Ejemplo

Paso por valorPaso por Referencia usando apuntadores

void change(int x, int y)

{

int temp;

temp = x;

void swap(int *x, int *y)

{

int temp;

temp = *x;temp = x;

x = y;

y = temp;

}

� La función no causa el efecto deseado ya que los valores solo se intercambian dentro de la función

temp = *x;

*x = *y;

*y = temp;

}

� Ahora la función realmente esta intercambiando los valores

� Este intercambio se vera reflejado al terminar la ejecución de la función

Page 13: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Ejemplo#include <stdio.h>

#include <stdlib.h>

void change(int x, int y);

void swap(int *x, int *y);

main()

{

int u = 5, v = 10;

printf("Antes de change u = %d, v = %d\n",u,v);

main

u

v

swap

xchange(u,v);

printf("Despues de change u = %d, v = %d\n",u,v);

printf("Antes de swap u = %d, v = %d\n",u,v);

swap(&u,&v);

printf("Despues de swap u = %d, v = %d\n",u,v);

system("pause");

return 0;

}

x

y

Page 14: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Ejemplo 2

� Realiza un programa que lea una frase y la analice para encontrar los siguientes datos:

� Numero de vocales

� Numero de consonantes

� Numero de dígitos

Numero de blancos� Numero de blancos

� Numero de cualquier otro carácter que no pertenezca a las clases antes mencionadas

Page 15: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Soluciónvoid ScanLine(char phrase[], int *v, int *co, int *d, in t *b, int *o)

{

int i=0; char c;

*v = 0; *co = 0; *d = 0; *b = 0; *o = 0;

while((c=toupper(phrase[i]))!= '\0')

{

if(c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U')

++ *v;

else if( c >= 'A' && c <= 'Z')

++ *co;

else if( c >= '0' && c <= '9')

++ *d;

else if (c == ' ' || c == '\t')

++ *b;

else

++ *o;

i++;

}

}

Page 16: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Solución#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

#define MAX 100

void ScanLine(char phrase[], int *v, int *co, int *d, int *b, int *o);

main()

{

char frase[MAX];

int voc,con,dig,blancos,otros;

printf("Proporciona una frase ");

gets(frase);

ScanLine(frase,&voc,&con,&dig,&blancos,&otros);

printf("La frase contiene %d vocales\n",voc);

printf("La frase contiene %d consonantes\n",con);

printf("La frase contiene %d digitos\n",dig);

printf("La frase contiene %d blancos\n",blancos);

printf("La frase contiene %d caracteres diversos\n",otros);

system("pause");

return 0;

}

Page 17: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Uso indebido de apuntadores#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

#define MAX 100

void ScanLine(char phrase[], int *v, int *co, int *d, int *b, int *o);

main()

{

char frase[MAX];

int *voc,*con,*dig,*blancos,*otros;

printf("Proporciona una frase ");

gets(frase);

ScanLine(frase,voc,con,dig,blancos,otros);

printf("La frase contiene %d vocales\n",voc);

printf("La frase contiene %d consonantes\n",con);

printf("La frase contiene %d digitos\n",dig);

printf("La frase contiene %d blancos\n",blancos);

printf("La frase contiene %d caracteres diversos\n",otros);

system("pause");

return 0;

}

Page 18: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Apuntadores y Arreglos

� Los apuntadores están fuertemente relacionados a los arreglos

� Cualquier operación que pueda ser relacionada con arreglos también puede realizarse con apuntadores

� Una variable de tipo arreglo es realmente un apuntador al primer elemento del arregloprimer elemento del arreglo

int x[10]

x

x[0]

x

x[3]

x+3 x+9

Page 19: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Operaciones con Apuntadores� Si tenemos un apuntador *pa y este apunta al primer elemento del arreglo a[0], entonces pa+1 apunta al siguiente elemento y pa+iapunta al i-esimo elemento

� El concepto de agregar uno al apuntador nos indica que el apuntador se movera al siguiente elemento del arreglo sin importar el tipo del arreglo

� Esta es la razón por la cual es importante declarar el tipo de apuntador, basados en el tipo, el apuntador se movera el número de bytes correspondiente a la siguiente variable

� Ejemplo� int *p entonces p+1 se moverá 4 bytes� char *p entonces p+1 se moverá 1 byte� double *p entonces p+1 se moverá 8 bytes

Page 20: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Apuntadores y Arreglos

int A[10];int *pa;

pa = &A[0];

Debido a que A es un apuntador a la primera posicion del arreglo, podemos escribir

pa = A

Para obtener el elemento del arreglo en la posición i entonces escribimos

x

x[0]

pa

x[3]

pa+3 pa+9

paposición i entonces escribimos

*(pa+i)

Page 21: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Ejemplo 3#include <stdio.h>

#include <stdlib.h>

int cadlong(char *s);

main()

{

char C[100];

printf("Proporciona una frase "); gets(C);

printf("La longitud de tu frase es %d\n\n",cadlong(C));

system("pause");

return 0;

}

int cadlong(char *s)

{

int n;

for(n=0; *s != '\0'; s++)

n++;

return n;

}

Page 22: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Ejemplo 4#include <stdio.h>

#include <stdlib.h>

void strcpy1(char *s, char *t);

main()

{

char C1[100],C2[100];

printf("Proporciona una frase "); gets(C1);

strcpy1(C2,C1);printf("La frase leida fue %s\n\n",C2);

system("pause");return 0;

}

void strcpy1(char *s, char *t)

{

int i = 0;

while(t[i] != '\0')

{

s[i]=t[i];

i++;

}

s[i] = '\0';

}

Page 23: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Versión 2

void strcpy2(char *s, char *t)

{

while(*t != '\0')

{

*s = *t;*s = *t;

s++; t++;

}

*s = '\0';

}

Page 24: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Versión 3

void strcpy3(char *s, char *t)

{

while((*s = *t) != '\0')

{

s++; t++;s++; t++;

}

}

Page 25: Apuntadores Unidad 3 - galia.fc.uaslp.mxgalia.fc.uaslp.mx/~rmariela/programacion/unidad31.pdf · Apuntadores y arreglos Apuntadores multidimensionales Apuntadores a funciones. Conceptos

Versión 4

void strcpy4(char *s, char *t)

{

while((*s++ = *t++) != '\0');

}

void strcpy5(char *s, char *t)

{

while((*s++ = *t++));

}