Bueno, son cosas diferentes. arr
se descompone en la mayoría de los contextos en un puntero al primer elemento de la matriz, lo que significa un puntero a la primera fila de 3 elementos en la matriz 2D: escriba int (*)[3]
. arr + 1
, luego, apunta a la segunda fila en la matriz.
&arr
es la dirección de la matriz en sí (tipo int (*)[3][3]
), por lo que &arr + 1
apunta a la memoria justo después del final de la totalidad de su matriz 2D.
Puede confirmar este comportamiento fácilmente imprimiendo de manera diferente. Específicamente, imprimir los desplazamientos a los nuevos punteros en lugar de los valores en sí mismos ayudará a aclarar las cosas. La salida de su programa a partir de estas declaraciones de impresión:
printf("%ld\n",(intptr_t)(&arr+1) - (intptr_t)arr);
printf("%ld\n",(intptr_t)(arr+1) - (intptr_t)arr);
serán los desplazamientos decimales a &arr+1
y arr+1
respectivamente. Aquí está la salida de una prueba que acabo de hacer:
36
12
36 partidos hasta: 3 filas × 3 columnas x 4 bytes por entrada = 36 bytes. Lo mismo ocurre con la fila 12: 1 × 3 columnas × 4 bytes por entrada = 12 bytes.
Nota: también está imprimiendo punteros usando %d
, lo cual es incorrecto. Probablemente deberías estar usando %p
para eso.
he aprendido mucho de su respuesta. Gracias. –
Con '% p', necesita convertir los punteros en' void * '. –