2012-08-08 8 views
5

tengo un programa de alrededor de 2-D matricesfavor explicar la diferencia

dirección base es 8678

#include<stdio.h> 
#include<conio.h> 
main() 
{ 
int arr[3][3]={ 
       {83,8,43}, 
       {73,45,6}, 
       {34,67,9} 
       }; 
printf("%d ",&arr+1); //points to 8696 
printf("%d ",arr+1); //points to 8684 
return 0; 
} 

¿cuál es la diferencia entre arr+1 y &arr+1?

Respuesta

9

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.

+2

he aprendido mucho de su respuesta. Gracias. –

+0

Con '% p', necesita convertir los punteros en' void * '. –

1

Puede resolver esto con la ayuda de esta equivalencia: X [Y] === * (X + Y)

Desde * (arr + 1) === arr [1], arr + 1 === & arr [1]

Del mismo modo, & arr + 1 === & ((& arr) [1])

¿Cuál es (& arr) [1]? Bueno, (& arr) [0] === * & arr === arr, que es, la matriz de 3x3 en sí, por lo que (& arr) [1] está siguiendo la matriz de 3x3 que, y & arr + 1 === & ((& arr) [1]) es la dirección de la matriz 3x3 que sigue a & arr ... un puntero al byte justo después de la matriz completa.

-1

array + 1 significa la dirección de la matriz [1] y cuesta 3 int de memoria.

& array + 1 significa la dirección de array [0] add 1;

+0

Incorrecto. Pruébalo y verás. O incluso solo mira la producción de OP, creo. –

+0

Pool English hace que me malinterpretes. array es un puntero que señala la dirección de la matriz, y (matriz + 1) es un puntero que señala la dirección de la matriz [1]. & array es la dirección de la matriz y luego agrega 1. – hupantingxue

+0

Carl Norum, me malinterpretas. – hupantingxue

0

Arr + 1 da el siguiente elemento de una matriz, mientras que & arr 1 da la dirección de la siguiente matriz de enteros

Cuestiones relacionadas