MANUAL DE PROGRAMACION EN C

++

1. APUNTADORES

Introducción
Una de las características más poderosas del lenguaje C++ es el manejo de apuntadores pues son de mucha utilidad en la manipulación y acceso de datos teniendo en cuenta las direcciones en las que éstos se encuentran guardados en la memoria. Adicionalmente, son muy útiles para pasar parámetros por referencia a funciones. Cuando se utilizan de manera incorrecta son también fuente de gran cantidad de errores.

Objetivo General
Estudiar la utilización de apuntadores, como una de las características más poderosas del lenguaje C++.

Objetivos específicos
Aprender a relacionar un dato con su posición de memoria. Manejar los apuntadores y su relación con arreglos y funciones. Comprender la importancia de las variables de referencia y el paso por referencia en funciones.

1.1

DECLARACIÓN E INICIALIZACIÓN DE VARIABLES TIPO APUNTADOR

Un apuntador es una de las características más poderosas del lenguaje de programación C++. Son variables que contienen direcciones de memoria en lugar de un valor específico. Es decir, apuntan a la dirección de la memoria en la que está guardado el valor específico de la variable. Suponga que la memoria es una matriz como la que se presenta en la siguiente figura. En la figura se pueden identificar dos tipos de variables: Las variables de color gris contienen valores específicos y están ubicadas en las direcciones de memoria F1 y A3. Las variables de color azul son apuntadores. Estas variables contienen como valores las direcciones de memoria en las que se encuentran otras variables con valores específicos.

1

Para el caso del ejemplo. Por ejemplo. En el ejemplo observe que uno de los apuntadores hace referencia a una variable tipo int y otro a una variable tipo char. De igual forma. el apuntador de la posición B1 hace referencia al valor A pero guardando la posición de la memoria en la que éste se encuentra. Las direcciones ubican las edificaciones dentro de la ciudad pero no hacen referencia directa a la edificación. F1.1 DECLARACIÓN DE LOS APUNTADORES Los apuntadores. Este asterisco indica que la variable ptrVariable es un apuntador a un double. 1. las edificaciones pueden ser diferentes tipos. al igual que todas las variables en C++. La forma de declarar los apuntadores es declarar primero el objeto al que se va a apuntar y el nombre del apuntador se precede de un asterisco (*). etc. La forma de leer la siguiente línea es “ptrVariable” apunta a una variable tipo double.1. es decir. la siguiente línea corresponde a la declaración de un apuntador a una variable que contiene un valor de tipo double. almacenes. 2 . Hacer referencia a un valor a través de un apuntador es conocido como indirección. que lo que se va a almacenar es una dirección de memoria. edificios.UNIVERSIDAD MILITAR “NUEVA GRANADA” CENTRO DE SISTEMAS A B C D E F1 1 A C3 De esta manera se puede ver que los apuntadores hacen referencia a valores específicos de manera indirecta. deben declararse antes de ser utilizados. Adicionalmente. tales como casas. double *ptrVariable. los apuntadores pueden hacer referencia a cualquier tipo de variable. es decir. Los apuntadores son como las direcciones en una ciudad.

double). double valor) { coeficientes[posición]=valor. Para inicializar el apuntador apuntando a nada se le debe asignar el valor 0 o NULL. } polinomio *ptrPol. //el grado máximo es 20 public: friend void modificarCoeficiente(int. Para ilustrar la inicialización considere el ejemplo polinomio del numeral anterior y ahora inicializaremos el apuntador a NULL. class polinomio { int grado. 1. }. La inicialización puede hacerse a una dirección de memoria o simplemente se puede inicializar el apuntador para que apunte a nada.1.MANUAL DE PROGRAMACION EN C++ En el siguiente ejemplo se presenta la creación de una clase polinomio y la definición de dos variables: una de tipo apuntador al polinomio llamada ptrPol y la otra de tipo polinomio llamada pol1.2 INICIALIZACIÓN DE LOS APUNTADORES Una vez declarado un apuntador. void modificarCoeficiente (int posicion. double coeficientes [21]. class polinomio { int grado. éste debe ser inicializado. 3 . pol1 .

2. double valor) { coeficientes[posición]=valor. pol1 . a continuación se describe cada uno de ellos. La segunda instrucción le asigna al 4 . *prtA . ptrA=&a . Devuelve la dirección en la que está guardada una variable. La primera línea define las variables int a y apuntador a int ptrA. 1. } polinomio *ptrPol. }. double).1 OPERADOR DIRECCIÓN El operador dirección (&) es uno de los más importantes de los definidos para variables de tipo apuntador. void modificarCoeficiente (int posicion. Considere las siguientes declaraciones: int a = 25.UNIVERSIDAD MILITAR “NUEVA GRANADA” CENTRO DE SISTEMAS double coeficientes [21].2 OPERADORES DE APUNTADORES Existen dos operadores principales que se utilizan cuando se trabaja con apuntadores: el operador de dirección (&) y el operador de indirección (*). ptrPol=NULL. //el grado máximo es 20 public: friend void modificarCoeficiente(int. 1.

en ella el apuntador se representa mediante una flecha que apunta a la variable a. El resultado que se va a obtener es la impresión del valor de la variable a. *ptrA = 100 . 5 . ptrA a 25 Las direcciones de memoria se trabajan en C++ como números hexadecimales. es decir.2. Considere la siguiente línea de código.2 OPERADOR INDIRECCIÓN El operador indirección (*) hace referencia al valor que tiene el objeto al que está haciendo referencia el apuntador. Se llama operador de indirección o desreferencia porque el procedimiento de modificar el valor del objeto al cual apunta se conoce como desreferenciación. Por otro lado. cout << *ptrA << endl . En la siguiente tabla se presenta el mismo ejemplo pero utilizando las direcciones de memoria de las variables. 25.MANUAL DE PROGRAMACION EN C++ apuntador ptrA la dirección de memoria en la que está guardada la variable a. la siguiente declaración modificará el valor de la variable a de 25 a 100. En la siguiente figura se presentan una forma de interpretar el anterior ejemplo. Nombre prtA … A Dirección 03E8 … 07D0 Valor 07D0 … 25 1.

/* Declara un apuntador entero */ int *pt2. pt1 = &j. int l. /* pt3 contiene la dirección del primer elemento de values */ pt3 = &values[0]. /* Esto es equivalente a la afirmación de arriba */ return 0. int *pt1.UNIVERSIDAD MILITAR “NUEVA GRANADA” CENTRO DE SISTEMAS En el siguiente ejemplo se hace uso de los operadores de apuntadores.2. Existen diferentes combinaciones entre apuntadores y datos constantes y no constantes. } 1. float results[100]. 6 . /* Declara un apuntador flotante */ j = 1. Si durante un programa se intenta modificar una variable que se ha calificado como constante se despliega un mensaje de error o de advertencia. /* pt1 contiene la dirección de la variable j */ pt2 = &k. float *pt3. /* pt2 contiene la dirección de la variable k */ pt3 = values. /* Declara un apuntador flotante */ float *pt4.3 APUNTADORES Y VARIABLES CONSTANTES El uso del calificador const permite informar al compilador que determinada variable no debe ser modificada. /* Declara un apuntador entero */ float values[100]. k = 2. int main() { int j. int k.

4. } // Convierte el vector a números positivos void conviertePositivo ( double *sPtr ) { while ( *sPtr != '###BOT_TEXT###' ) // ciclo hasta que se termine el vector 28 if ( *sPtr < 0 ) // si el número es negativo. return 0. void conviertePositivo ( double * ). using std::endl. En este caso no se hace uso del calificador const. // mueve sPtr a la siguiente cadena de caracteres } // fin while } // fin función 7 . de modo tal que solo quedan números positivos. int main() { double numero[] = {-10.7. *sPtr = 0.5. En el siguiente ejemplo se tiene un vector de números tanto positivos como negativos y se convierten todos los números negativos a cero. #include <iostream> using std::cout. // lo convierte a 0 { sPtr++.8}. conviertePositivo ( numero ).MANUAL DE PROGRAMACION EN C++ Apuntador no constante a un dato no constante En este caso tanto el apuntador como el dato al que el apuntador hace referencia se pueden modificar.

int main() { int x. } // end function f Tomado de [3] Apuntador constante a un dato no constante Un apuntador constante a un dato no constante es un apuntador que apunta siempre a la misma dirección de memoria pero el dato que se encuentra en dicha dirección se puede modificar utilizando el apuntador. } 8 . *ptr = 7. En el siguiente ejemplo se intenta modificar un apuntador constante y se produce un error de compilación. return 0.UNIVERSIDAD MILITAR “NUEVA GRANADA” CENTRO DE SISTEMAS Apuntador no constante a un dato constante Un apuntador no constante a un dato constante es un apuntador que se puede modificar para que apunte a otro elemento pero dicho elemento no se puede modificar mediante el apuntador. f( &y ). // ptr es un apuntador constante a un int // que puede modificarse pero siempre apunta // a la misma dirección. // error: no se puede modificar un objeto const. ptr = &y. void f( const int * ). int main() { int y. } // fin main // xPtr no puede modificar el valor de la variable a la cual apunta void f( const int *xPtr ) { *xPtr = 100. // el apuntador constante se debe inicializar. En el siguiente ejemplo la función f trata de hacer una modificación a un valor constante a través de su apuntador. int * const ptr = &x. // error: ptr es constante return 0. // permitido: *ptr no es constante. y. Esto devolverá un error de compilación. // f intenta una modificación ilegal.

De la misma manera para hacer referencia al elemento 4 del arreglo las siguientes expresiones son equivalentes: * (ptrA+4). ptrA= &a[0].3. 1. double. Esta expresión corresponde a la acción desplazamiento del apuntador y esta notación es conocida como notación apuntador/desplazamiento.MANUAL DE PROGRAMACION EN C++ Tomado de [3] Apuntador constante a un dato constante En este caso ni el apuntador ni el objeto al que el apuntador hace referencia pueden modificarse. 1. si se declara un arreglo int a[5] y un apuntador int *ptrA.1 EXPRESIONES Los arreglos y los apuntadores están íntimamente relacionados en C++. es decir.3 EXPRESIONES Y ARITMÉTICA DE APUNTADORES Al igual que las variables que se han trabajado hasta ahora. 1. Un nombre de un arreglo se puede ver como un apuntador constante. mediante la cual para hacer referencia al elemento 4 del apuntador se utiliza la siguiente expresión: ptrA[4].2 OPERACIONES En C++ se pueden realizar algunas operaciones con apuntadores. Las operaciones aritméticas que se realizan con apuntadores difieren de las operaciones aritméticas convencionales pues la 9 .3. como int. las variables de apuntador o apuntadores también se pueden manipular a través de expresiones aritméticas. etc. Por otro lado existe la notación apuntador/subíndice. a continuación se explica la forma de hacerlo.. las dos siguientes expresiones son equivalentes entre sí: ptrA = a. a[4].

en general. Algunas de las operaciones aritméticas que se pueden realizar con apuntadores son: Incremento (++). La cantidad de memoria está determinada por el tipo de variable y en C++ la función sizeof permite conocer el tamaño en bytes de cualquier objeto. Asigna a la nueva variable el número de elementos que hay entre los apuntadores.UNIVERSIDAD MILITAR “NUEVA GRANADA” CENTRO DE SISTEMAS aritmética de apuntadores tiene en cuenta el tamaño del objeto en memoria al que hace referencia el apuntador (número de bytes). Por ejemplo. En la aritmética convencional incrementar en uno un número es sumarle 1. en la aritmética el operador ++ aumenta el apuntador no solamente en 1 sino en 1 multiplicado por el número de bytes que ocupa en memoria la variable a la que el apuntador hace referencia. Operación Apuntador original 1000 1004 x[0] Gráfica 1008 x[1] 1012 x[2] x[4] xPtr 10 . A continuación se presentan algunas operaciones que se pueden realizar con el apuntador a este vector. Sumar o restar apuntadores del mismo tipo. Se define además un apuntar a la primera posición del vector xPtr: int x[4].ó +=/-=): Al igual que los anteriores operadores sumar o restar tiene en cuenta el número de bytes de las variables. es decir 5++ arroja 6. xPtr=x. se declara un vector de tamaño 4. int x[4] y supondremos que su primer elemento se encuentra ubicado en la posición 1000. Sin embargo. Disminución (--): La nueva posición de memoria del apuntador se disminuye en 1 multiplicado por el número de bytes que ocupa en memoria la variable a la que el apuntador hace referencia. Sumar/restar un entero a un apuntador (+/. las variables de tipo int tienen un tamaño en memoria de 4 bytes.

Existen dos operadores fundamentales con apuntadores: Operador dirección (&): Devuelve la dirección de una variable en memoria. Los apuntadores deben inicializarse.MANUAL DE PROGRAMACION EN C++ xPtr ++. 1000 1004 x[0] 1008 x[1] 1012 x[2] x[4] xPtr xPtr += 3. Con apuntadores se pueden realizar operaciones aritméticas de sumar o restar enteros. Los apuntadores se pueden utilizar para pasar y modificar variables por referencia a funciones. Estas operaciones suman o restan dependiendo del tamaño de la variable a la que el apuntador hace referencia. 1000 1004 x[0] 1008 x[1] 1012 x[2] x[4] xPtr Por otro lado se puede asignar un apuntador a otro si estos son del mismo tipo. generalmente a una dirección de memoria o a ninguna parte usando 0. Operador indirección (*): Devuelve un sinónimo para el nombre de objeto al que el apuntador hace referencia. La declaración de los apuntadores se hace utilizando el asterisco (*). La expresión int * aPrt declara un apuntador a una variable de tipo int. 11 . Resumen Los apuntadores son variables que almacenan direcciones de otras variables. Así mismo. existen comparaciones de igualdad y relaciones.

Arnush Craig. Páginas 197 a 214. Editorial Mc Graw Hill. int n). C++ Desarrollo de Proyectos. 2ª Edición 2002. Actividades complementarias Escriba un programa que muestre como diferentes tipos de apuntadores se pueden utilizar para recorrer arreglo que almacene datos de diferentes tipos. Lecturas recomendadas JOYANES. Editorial Prentice Hall. SMITH JO ANN.UNIVERSIDAD MILITAR “NUEVA GRANADA” CENTRO DE SISTEMAS Los apuntadores pueden asignarse entre sí siempre y cuando sean del mismo tipo. que retorna la suma de elementos de tipo double apuntados por los n primeros apuntadores del arreglo p: double suma (double *p[ ]. Escriba el código de la siguiente función. Editorial Paraninfo. Páginas 127 a 145. Programación en C++. Páginas 149 a 160. 12 . 2001. estructuras de datos y objetos. Algoritmos.. Luis J. Aprendiendo Borland C++ 5 en 21 días.