Data">
García Mendoza Glosario7
García Mendoza Glosario7
García Mendoza Glosario7
Introducción a la programación
Glosario 7
Apuntador o puntero.
Un apuntador es una variable que contiene la dirección de otra variable y se representa por medio de los
operadores de dirección (&) e indirección (*). El primero proporciona la dirección de un objeto y el segundo
permite el acceso al objeto del cual se tiene la dirección.
tipo_de_dato_al_que_apunta * identificador ;
El operador * es un operador unario, y se lee como “el contenido al que apunta”, es decir, permite acceder
a un dato a través de un apuntador que lo apunte. Este acceso es de tipo indirecto. No obstante, el
símbolo * también se utiliza al definir un apuntador: precede al identificador del apuntador y sucede al tipo
de dato al que apunta.
El operador & también es un operador unario, y se lee como “la dirección de memoria de”, es decir, extrae
la dirección de memoria base del dato al que precede.
Es un apuntador que inicialmente contiene una dirección que no es válida (o no apunta a nada: valor
NULL). Se produce al definir un apuntador, sin inicializarlo. Puede provocar un fallo en el programa o
comportarse de manera extraña (modificar un dato del programa, el código del propio programa o el
código del propio S.O.). En C, los punteros que no están específicamente inicializados pueden apuntar a
direcciones impredecibles en la memoria.
¿Qué es la aritmética de apuntadores?
La aritmética de punteros es una aritmética un tanto especial. Trabaja tomando como unidad de cálculo el
tamaño del tipo base. Se pueden utilizar los operadores de suma, resta, multiplicación, incremento,
decremento, relacionales y de asignación. Un ejemplo se muestra a continuación:
int dias[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
typedef int* tIntPtr;
tIntPtr punt = dias;
punt empieza apuntando al primer elemento del array:
printf(“%d“, *punt); // Muestra 31 (primer elemento)
punt++;
punt++ hace que punt pase a apuntar al siguiente elemento
printf(“%d“, *punt); // Muestra 28 (segundo elemento)
A la dirección de memoria actual se le suman tantas unidades
como bytes (4) ocupe en memoria un dato de ese tipo (int).
Otro ejemplo:
int X[3] = {0, 1, 2};
int* IX = &X[1];
X = *(IX + 1);
/* X se modifica. El apuntador IX se desplaza una posición y accede
temporalmente a X[2], por lo tanto X toma este valor (2). Observa que
IX no se reasigna. */
tipo_punteros * id_array[talla];
Generalmente, se hace uso de esta equivalencia en el paso de arrays a subprogramas. El nombre del
array es un puntero: ya es un paso por referencia.
Prototipos equivalentes para parámetros array:
const int N = ...;
void cuadrado(int arr[N]);
void cuadrado(int arr[], int size); // Array no delimitado
void cuadrado(int *arr, int size); // Puntero
Arrays no delimitados y punteros: se necesita la dimensión
Elementos: se acceden con índice (arr[i]) o con puntero (*arr).
Es decir, dos sentencias equivalentes serían:
X = arr[i];
X = *(arr + i);
O también:
Y = arr[i + 1];
Y = *(arr + i + 1);
BIBLIOGRAFÍA