En int (*x)[10];
x
es un puntero a un array de 10 int
s¿Por qué esta declaración no funciona
Entonces, ¿por qué este código no compila:
int arr[3] ;
int (*p)[3] =arr;
Pero esto funciona:
int arr[3];
int (*p)[3] =&arr;
En int (*x)[10];
x
es un puntero a un array de 10 int
s¿Por qué esta declaración no funciona
Entonces, ¿por qué este código no compila:
int arr[3] ;
int (*p)[3] =arr;
Pero esto funciona:
int arr[3];
int (*p)[3] =&arr;
arr
es una expresión que se evalúa como int*
(esta es la famosa hazaña de "arrays de decaimiento a puntero" ure).
&arr
es una expresión que se evalúa como int (*)[3]
. 'decadencia'
nombres de matriz de punteros al primer elemento de la matriz en todas las expresiones excepto cuando son operandos a los sizeof
o &
operadores. Para esas dos operaciones, los nombres de los arreglos retienen su 'arreglo' (C99 6.3.2.1/3 "Lvalues, arrays y designadores de funciones").
No funciona exactamente por la misma razón que:
int i;
int* pi = i; // error: no conversion from int to int*
+1: También me gustaría señalar que, aunque de un tipo diferente, ambas expresiones devuelven la misma dirección del puntero. –