2012-03-16 14 views
6

me escribió una función que toma un puntero a una matriz para inicializar sus valores:Puntero al array como parámetro de la función

#define FIXED_SIZE 256 
int Foo(int *pArray[FIXED_SIZE]) 
{ 
/*...*/ 
} 

//Call: 

int array[FIXED_SIZE]; 
Foo(&array); 

Y no compila:

error C2664: 'Foo': no ​​puede convertir parámetro 1 de 'int (* __ w64) [256]' a 'int * []'

Sin embargo, lo pirateé todo:

typedef int FixedArray[FIXED_SIZE]; 
int Foo(FixedArray *pArray) 
{ 
/*...*/ 
} 

//Call: 

FixedArray array; 
Foo(&array); 

Y funciona. ¿Qué me estoy perdiendo en la primera definición? Pensé que los dos sería equivalente ...

Respuesta

13
int Foo(int *pArray[FIXED_SIZE]) 
{ 
/*...*/ 
} 

En el primer caso, pArray es una matriz de punteros, no un puntero a una matriz.

Es necesario paréntesis, a utilizar un puntero a una matriz:

int Foo(int (*pArray)[FIXED_SIZE]) 

Usted consigue esto de forma gratuita con el typedef (ya que es ya un tipo, el * tiene un significado diferente). Dicho de otra manera, el tipo typedef viene con sus propios paréntesis.

Nota: la experiencia muestra que en el 99% de los casos en los que alguien usa un puntero a una matriz, podían y debían usar un puntero al primer elemento.

+0

Sí, puntero al primer elemento, así como el tamaño (si es necesario, que probablemente sea). –

+0

¡Me ganaste! – Mosby

0

Una matriz se desintegra a un puntero. Por lo tanto, funciona en el segundo caso. Mientras que en el primer caso, el parámetro de función es una matriz de punteros pero no un puntero a entero que apunta al primer elemento de la secuencia.

2

Una cosa es sencilla de recordar la regla de las agujas del reloj en espiral que se pueden encontrar en http://c-faq.com/decl/spiral.anderson.html

que evaluaría el primero en ser una matriz de punteros. El segundo es un puntero a una matriz de tamaño fijo.

Cuestiones relacionadas