2011-10-13 22 views
8

Si tengo una matriz declarada como esto:Sizeof Puntero al array

int a[3][2]; 

entonces ¿por qué es:

sizeof(a+0) == 8 

Considerando lo siguiente:

sizeof(a) == 24 

No entiendo cómo la adición 0 al puntero cambia la salida sizeof. ¿Hay quizás algún tipo de elenco implícito?

Respuesta

12

Si se agrega a 0a, entonces a se convierte primero en un valor de puntero de tipo int(*)[2] (apuntando al primer elemento de una matriz de tipo int[3][2]). A continuación, se agrega 0, que agrega 0 * sizeof(int[2]) bytes a la dirección representada por ese valor de puntero. Dado que esa multiplicación produce 0, arrojará el mismo valor de puntero. Dado que es un puntero, sizeof(a+0) produce el tamaño de un puntero, que es de 8 bytes en su cuadro.

Si lo hace sizeof(a), no hay ninguna razón para que el compilador para convertir a a un valor de puntero (que sólo tiene sentido si desea elementos de índice o para hacer la aritmética de punteros que implica la dirección de los elementos). Así que la expresión a permanece siendo de tipo array, y obtienes el tamaño de int[3][2] en vez del tamaño de int(*)[2]. Entonces, 3 * 2 * sizeof(int) que en su caja es de 24 bytes.

Espero que esto aclare las cosas.

+0

Llamar 'sizeof (a + 0)' es lo mismo que hacer 'sizeof (a [0])', que toma el tamaño del primer elemento 'int [2]' en la matriz, por lo que 'sizeof (int) * 2 = 8'. No está tomando el tamaño de un puntero. –

+0

@Remy Agradecería si formulara esa teoría y la publicara como un documento –

+2

@ RemyLebeau-TeamB: 'a [0]' es equivalente a '* (a + 0)', no '(a + 0)' . –

0

sizeof te indica el tamaño del tipo de expresión. Cuando agrega 0 a a, el tipo se convierte en un puntero (8 bytes en sistemas de 64 bits).