¿Qué es un PUNTERO ?:

  • View
    47

  • Download
    4

Embed Size (px)

DESCRIPTION

Qu es un PUNTERO ?: Un puntero es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la direccin de memoria de otra variable. No hay que confundir una direccin de memoria con el contenido de esa direccin de memoria. int x = 25;. - PowerPoint PPT Presentation

Transcript

  • Ismael Camarero

  • Qu es un PUNTERO?:Un puntero es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la direccin de memoria de otra variable.No hay que confundir una direccin de memoria con el contenido de esa direccin de memoria. int x = 25;

    Direccin 1502 1504 1506 1508 La direccin de la variable x (&x) es 1502El contenido de la variable x es 25

    ......25............

    Ismael Camarero

  • Las direcciones de memoria dependen de la arquitectura del ordenador y de la gestin que el sistema operativo haga de ella. En lenguaje ensamblador se debe indicar numricamente la posicin fsica de memoria en que queremos almacenar un dato. De ah que este lenguaje dependa tanto de la mquina en la que se aplique. En C no debemos, ni podemos, indicar numricamente la direccin de memoria, si no que utilizamos una etiqueta que conocemos como variable (en su da definimos las variables como direcciones de memoria). Lo que nos interesa es almacenar un dato, y no la localizacin exacta de ese dato en memoria.

    Ismael Camarero

  • Una variable puntero se declara como todas las variables. Debe ser del mismo tipo que la variable apuntada. Su identificador va precedido de un asterisco (*): int *punt;Es una variable puntero que apunta a variable que contiene un dato de tipo entero llamada punt. char *car:Es un puntero a variable de tipo carcter. long float *num; float *mat[5]; // . . .Un puntero tiene su propia direccin de memoria: &punt&car

    Ismael Camarero

  • Es decir: hay tantos tipos de punteros como tipos de datos, aunque tambin pueden declararse punteros a estructuras ms complejas (funciones, struct, ficheros...) e incluso punteros vacos (void ) y punteros nulos (NULL).Declaracin de variables puntero: Sea un fragmento de programa en C:

    char dato; //variable que almacenar un carcter. char *punt; //declaracin de puntero a carcter. punt = &dato; //en la variable punt guardamos la direccin // de memoria de la variable dato; punt apunta // a dato. Ambas son del mismo tipo, char.

    Ismael Camarero

  • int *punt = NULL, var = 14;punt = &var; printf(%#X, %#X, punt, &var) //la misma salida: direccinprintf(\n%d, %d, *punt, var); //salida: 14, 14 Hay que tener cuidado con las direcciones apuntadas:printf(%d, %d, *(punt+1), var+1);*(punt + 1) repesenta el valor contenida en la direccin de memoria aumentada en una posicin (int=2bytes), que ser un valor no deseado. Sin embargo var+1 representa el valor 15.punt + 1 representa lo mismo que &var + 1 (avance en la direccin de memoria de var).

  • Al trabajar con punteros se emplean dos operadores especficos: Operador de direccin: & Representa la direccin de memoria de la variable que le sigue: &fnum representa la direccin de fnum. Operador de contenido o indireccin: *El operador * aplicado al nombre de un puntero indica el valor de la variable apuntada:float altura = 26.92, *apunta;apunta = &altura; //inicializacin del puntero

    Ismael Camarero

  • float altura = 26.92, *apunta;apunta = &altura; //inicializacin del puntero.printf(\n%f, altura); //salida 26.92.printf(\n%f, *apunta);No se debe confundir el operador * en la declaracin del puntero: int *p;Con el operador * en las instrucciones: . *p = 27; printf(\nContenido = %d, *p);

  • Veamos con un ejemplo en C la diferencia entre todos estos conceptos Veamos el archivo - punt0.cpp - punt1.cppEs decir: int x = 25, *pint; pint = &x;La variable pint contiene la direccin de memoria de la variable x. La expresin: *pint representa el valor de la variable (x) apuntada, es decir 25. La variable pint tambin tiene su propia direccin: &pint

    Ver sumpun.cpp

    Ismael Camarero

  • Veamos con otro ejemplo en C la diferencia entre todos estos conceptos void main(void) {int a, b, c, *p1, *p2;void *p;p1 = &a; // Paso 1. La direccin de a es asignada a p1*p1 = 1; // Paso 2. p1 (a) es igual a 1. Equivale a a = 1;p2 = &b; // Paso 3. La direccin de b es asignada a p2*p2 = 2; // Paso 4. p2 (b) es igual a 2. Equivale a b = 2;p1 = p2; // Paso 5. El valor del p1 = p2*p1 = 0; // Paso 6. b = 0

  • p2 = &c; // Paso 7. La direccin de c es asignada a p2*p2 = 3; // Paso 8. c = 3printf("%d %d %d\n", a, b, c); // Paso 9. Qu se imprime?p = &p1; // Paso 10. p contiene la direccin de p1*p = p2; // Paso 11. p1= p2;*p1 = 1; // Paso 12. c = 1printf("%d %d %d\n", a, b, c); // Paso 13. Qu se imprime? }

    Ismael Camarero

  • Vamos a hacer un seguimiento de las direcciones de memoria y de los valores de las variables en cada paso. Suponemos que la variable a es colocada en la direccin 0000, b en la siguiente, es decir 0002, con un offset de 2 bytes, por ser valores integer. Se trata de un sistema de posiciones relativas de memoria. Se ver en aritmtica de punteros.Se obtiene el siguiente cuadro. En l reflejamos las direcciones relativas de memoria y los cambios en cada uno de los pasos marcados:

    Ismael Camarero

  • Pasoa 0000b0002c0004p10006p20008p00101000021000031000000024120000000251200020000610000200027100002000481030002000491030002000410103000200040006111030004000400061210100040004000613101000400040006

    Ismael Camarero

  • Inicializacin de punteros(I):

    Si es extern o static, deber ser una expresin constante del tipo expresado.Si es auto, entonces puede ser cualquier expresin del especificado.Ejemplos:La constante entera 0, NULL (cero) proporciona un puntero nulo a cualquier tipo de dato: int *p; p = NULL; //actualizacin

    < Almacenamiento > < Tipo > * < Nombre > = < Expresin >

  • Inicializacin de punteros(II):2) El nombre de un array de almacenamiento static o extern se transforma segn la expresin: a) float mat[12]; float *punt = mat; b) float mat[12]; float *punt = &mat[0]; 3) Un cast puntero a puntero: int *punt = (int *) 123.456;Inicializa el puntero con el entero.

    Ismael Camarero

  • Inicializacin de punteros(III):4) Un puntero a carcter puede inicializarse en la forma: char *cadena = Esto es una cadena; 5) Se pueden sumar o restar valores enteros a las direcciones de memoria en la forma: (aritmtica de punteros) static int x; int *punt = &x+2, *p = &x-1;6) Equivalencia: Dos tipos definidos como punteros a objeto P y puntero a objeto Q son equivalentes slo si P y Q son del mismo tipo. Aplicado a matrices: nombre_puntero = nombre_matriz;

  • PUNTEROS Y ARRAYSSea el array de una dimensin: int mat[ ] = {2, 16, -4, 29, 234, 12, 0, 3};en el que cada elemento, por ser tipo int, ocupa dos bytes de memoria.Suponemos que la direccin de memoria del primer elemento, es 1500: &mat[0] es 1500 &mat[1] ser 1502 &mat[7] ser 1514

    Ismael Camarero

  • PUNTEROS Y ARRAYS int mat[ ] = {2, 16, -4, 29, 234, 12, 0, 3};En total los 8 elementos ocupan 16 bytes.Podemos representar las direcciones de memoria que ocupan los elementos del array , los datos que contiene y las posiciones del array en la forma:

    Direccin 1502 1504 1506 1508 1510 1512 1514 Elemento mat[1] mat[2] mat[3] mat[4] mat[5] mat[6] mat[7]

    216-4292341203

    Ismael Camarero

  • Direccin 1502 1504 1506 1508 1510 1512 1514El acceso podemos hacerlo mediante el ndice: x = mat[3]+mat[5]; // x = 29 + 12 para sumar los elementos de la cuarta y sexta posiciones. Como hemos dicho que podemos acceder por posicin y por direccin: Es lo mismo &mat[0] y mat?Y &mat[1] = mat++ ?Veamos el cdigo de un ejemplo:Elemento mat[1] mat[2] mat[3] mat[4] mat[5] mat[6] mat[7]

    216-4292341203

    Ismael Camarero

  • #include #include int mat[5]={2, 16, -4, 29, 234, 12, 0, 3}, i; //declaradas como globalesvoid main() { printf("\n%d", &mat[0]); //resultado: 1500 (direccin de mem) printf("\n%p", mat); //resultado: 1500 ( " " " " " ) i++; //i=1 printf("\n%p", mat+i); //resultado: 1502 ( " " " " " ) printf("\n%d", *(mat+i)); //resultado: 16 (valor de mat[1] o valor getch(); } //en la direccin 1502

    Ismael Camarero

  • Comprobamos con un ejemplo: dirmen.cpp ejemplo

    Parece deducirse que accedemos a los elementos del array de dos formas: - mediante el subndice. - mediante su direccin de memoria.

    Elemento mat[1] mat[2] mat[3] mat[4] mat[5] mat[6] mat[7]

    216-4292341203

    Ismael Camarero

  • Analizando las direcciones de memoria del array: &mat[0] &mat[1] &mat[2] &mat[3] &mat[4] &mat[5] & mat[6] &mat[7]

    mat mat+1 mat+2 mat+3 mat+4 mat+5 mat+6 mat+7 Direccin del elemento 0Direccin del octavo elementoPuntero a la direccin del elemento 0Incremento en unaunidad int (dos by