Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


4.3.5  Matrices de punteros

§1  Presentación

Como cualquier otra variable, los punteros (del mismo tipo) pueden estar contenidos en matrices; las declaraciones tienen la forma:

int* iptr[10]              // matriz de 10 punteros a entero
char* cptr[10];            // matriz de 10 punteros a carácter
void (* fptr[10])(char);   // matriz de 10 punteros a función...


Con estas declaraciones,  iptr[i] es un puntero a entero, y cptr[j] un puntero a carácter, mientras que *iptr[i] es el int al que apunta el elemento i de la matriz. Del mismo modo, *cptr[j] es el char apuntado por el elemento j.

En el tercer caso, fptr es una matriz de 10 punteros a funciones que reciben un char y devuelven void. Es decir, funciones del tipo:

void funcion (char ch) { /* ... */ }


§1.1  No confundir una matriz de punteros con un puntero a matriz. Observe como los paréntesis cambian totalmente el significado de las sentencias ( 6.1):

int* pt1[10]          // matriz de 10 punteros a entero
int (*pt2)[10]        // puntero a matriz de 10 enteros
int (* pt3[10])();    // matriz de 10 punteros a función

Nota:  la función main (argc, agrv) ( 4.4.4) presenta un primer ejemplo de ambos casos: "Puntero a matriz de punteros" y "Matriz de punteros".  En concreto, el argumento argv es un puntero a una matriz de punteros.

§2  Inicialización

Es interesante considerar que una matriz de punteros puede definirse directamente en la propia declaración. Consideremos el siguiente caso, que define un matriz de cuatro punteros a matrices de caracteres:

char* est[] = {"Primavera", "Verano", "Otoño", "Invierno"};

El proceso sería como sigue: el compilador crea cuatro cadenas de caracteres de 10, 7, 6 y 9 caracteres respectivamente y las almacena en algún sitio (pueden estar contiguas o no). También crea un matriz de 4 punteros a carácter con nemónico est; sus elementos est[0] a est[3] (que si son contiguos) son las direcciones de los caracteres "P", "V", "O" e "I" respectivamente.


§3  El ejemplo que sigue define un matriz de dos punteros a función:

void f1(int);                      // L.1:
void f2(int);                      // L.2:
void (* apt[])(int) = {f1, f2};    // L.3:

Las líneas L.1 y L.2 no requieren comentario,  se trata simplemente de los prototipos de dos funciones ( 4.4.1).

L.3 define apt como una matriz de punteros-a-función que reciben un int y devuelven void (exactamente del tipo de las funciones f1 y f1 declaradas en las líneas anteriores). Esta línea también inicia la matriz apt con dos valores.

Observe como los nombres de las funciones se han tomado como sinónimo de sus "direcciones", y que no ha sido necesario declarar el tamaño de la matriz, el compilador lo deduce (dos elementos) por el Rvalue ( 2.1.5) de la propia inicialización.


§4  También es importante señalar que para que sus direcciones puedan almacenarse en una matriz, todas las funciones deben recibir los mismos argumentos y devolver el mismo valor, lo que nos deja que deben diferenciarse forzosamente en sus nombres (f1 y f2 en este caso), además del las diferencias que pueda haber en sus cuerpos.


§5  Las matrices de punteros a funciones ( 4.2.4) son especialmente interesantes. Este tipo de matrices representan tablas de funciones, con la que se puede manejar alternativas; en lugar de utilizar las clásicas sentencias del tipo if... then else ( 4.10.2), se ejecuta una u otra función en base a una variable. Esta forma de codificación se denomina "código dirigido por tablas" ( 4.2.4b Ejemplo 3).

§6  Tema relacionado
  • Matrices de estructuras ( 4.5.6).