Si se agrega a 0
a
, 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.
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. –
@Remy Agradecería si formulara esa teoría y la publicara como un documento –
@ RemyLebeau-TeamB: 'a [0]' es equivalente a '* (a + 0)', no '(a + 0)' . –