2011-05-25 11 views
9

Tengo una matriz de punteros int int* arr[MAX]; y quiero almacenar su dirección en otra variable. ¿Cómo puedo definir un puntero a una matriz de punteros? es decir:Puntero a matriz de punteros

int* arr[MAX]; 
int (what here?) val = &arr; 

Respuesta

12

sólo debe ser:

int* array[SIZE]; 
int** val = array; 

No hay necesidad de utilizar un operador de dirección en array desde la decadencia matrices en punteros implícitos en el lado derecho del operador de asignación.

+0

Pero quiero un puntero a una matriz, no una matriz en sí misma. – moteutsch

+0

@moteustch Bueno, tienes un puntero a los datos de la matriz, que es casi lo mismo. –

+4

Sí, 'val' es un puntero al conjunto de punteros' int' (semánticamente hablando) ... si eliminó la referencia 'val', terminará con su matriz de punteros nuevamente, es decir, puede hacer' (* val) [INDICE] '. Entonces, como 'val' mantiene la dirección al inicio de una matriz de' int * ', entonces es un puntero a una matriz de punteros. – Jason

1

IIRC, las matrices son convertir implícitamente a los punteros, por lo que sería:

int ** val = arr; 
+0

Creo que va a lanzar y error en el compilador para el tipo pegaban ya 'arr' en realidad es de tipo "matriz de punteros de-a int' en lugar de "pointer-to-int" – Jason

+0

Las matrices SON convertibles en punteros ... Pero no al revés. Y también los punteros a matrices no son implícitamente convertibles en punteros a punteros. Etcétera, etcétera – Kos

+0

Pero si una matriz es convertible a un puntero, ¿no sería el original el mismo que 'int ** arr'? Entonces' & arr' sería 'int ***', no? – moteutsch

0

Por lo que yo sé no hay ningún tipo específico de "matriz de enteros" en c, por lo que es imposible tener un puntero específico para ello. Lo único que puede hacer es usar un puntero al int: int*, pero debe tener en cuenta un tamaño de int y la longitud de su matriz.

+0

'int []' es una matriz de enteros y es * diferente * de 'int *', pero decaerá implícitamente a 'int *' cuando se usa como un argumento de función o en un contexto donde se realiza la aritmética del puntero. – dmckee

+0

C ciertamente tiene tipos de matriz y no son iguales a los tipos de puntero, si eso es lo que estás pensando. Intente compilar 'int main() {int a [1] = {0}; int i; a = & i; return 0; } ' –

+0

La diferencia más importante entre los tipos de matriz y los tipos de puntero es cómo responden a' sizeof'. – Kos

19

La respuesta correcta es:

int* arr[MAX]; 
int* (*pArr)[MAX] = &arr; 

O simplemente:

 int* arr [MAX]; 
typedef int* arr_t[MAX]; 

arr_t* pArr = &arr; 

La última parte se lee como "Parr es un puntero al array de elementos de tipo MAX puntero a int".

En C, el tamaño de la matriz se almacena en el tipo, no en el valor. Si desea que este puntero maneje correctamente la aritmética de punteros en las matrices (en caso de que desee crear una matriz 2D y usar este puntero para iterar sobre ella), usted - a menudo por desgracia - necesita tener el tamaño de matriz incrustado en el tipo de puntero.

Afortunadamente, dado que C99 y VLAs (tal vez incluso antes que C99?) MAX se puede especificar en tiempo de ejecución, no en tiempo de compilación.

-1

Según esta fuente http://unixwiz.net/techtips/reading-cdecl.html, utilizando el "ir a la derecha cuando se puede, ir a la izquierda cuando se debe" regla, obtenemos los siguientes 2 significados de las declaraciones dadas en las respuestas anteriores -

int **val ==> val is a pointer to pointer to int 
int* (*pArr)[MAX] ==> pArr is a pointer to an array of MAX length pointers to int. 

Espero que los significados anteriores tengan sentido y si no lo hacen, probablemente sería una buena idea leer detenidamente la fuente mencionada.

Ahora debe quedar claro que la segunda declaración es la que moteutsch está buscando, ya que declara un puntero a una matriz de punteros.

Entonces, ¿por qué la primera también funciona? Recuerde que

int* arr[MAX] 

es una matriz de enteros punteros. Por lo tanto, val es un puntero al puntero a la primera int declarada dentro de la matriz de puntero int.

0

Creo que la respuesta es simple:

int **val;<br> 
val = arr; 
Cuestiones relacionadas