2012-08-08 12 views
5

ho un programma su array 2-DSi prega di spiegare la differenza

base di indirizzo è 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; 
} 

qual è la differenza tra il arr+1 e &arr+1?

risposta

9

Beh, sono cose diverse. arr decadono nella maggior parte dei contesti con un puntatore al primo elemento dell'array, ovvero un puntatore alla prima riga di 3 elementi nell'array 2D: digitare int (*)[3]. arr + 1, quindi, punta alla seconda riga nell'array.

&arr è l'indirizzo della matrice stessa (tipo int (*)[3][3]), quindi i punti &arr + 1 alla memoria superano la fine dell'intero array 2D.

È possibile verificare facilmente questo comportamento stampando in modo diverso. In particolare, la stampa degli offset per i nuovi puntatori anziché i valori stessi aiuterà a chiarire le cose. L'uscita dal programma da queste dichiarazioni di stampa:

printf("%ld\n",(intptr_t)(&arr+1) - (intptr_t)arr); 
printf("%ld\n",(intptr_t)(arr+1) - (intptr_t)arr); 

sarà l'offset decimali da &arr+1 e arr+1 rispettivamente. Ecco l'output di un test che ho appena fatto:

36 
12 

36 partite fino: 3 righe × 3 colonne × 4 byte per ogni linea = 36 byte. Così fa la colonna 12: 1 × 3 × 4 byte per voce = 12 byte.

Nota: si sta anche stampando i puntatori usando %d, che è sbagliato. Probabilmente dovresti usare %p per quello.

+2

ho imparato molto dalla vostra risposta. Grazie. –

+0

Con '% p', devi lanciare i puntatori su' void * '. –

1

È possibile calcolare questo fuori con l'aiuto di questa equivalenza: X [Y] === * (X + Y)

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

Allo stesso modo, & arr + 1 === & ((& arr) [1])

Qual è (& arr) [1]? Ebbene, (& arr) [0] === * & arr === arr, cioè la matrice 3x3 stessa, così (& arr) [1] è la matrice 3x3 segue che, e & arr + 1 === & ((& arr) [1]) è l'indirizzo della matrice 3x3 che segue & arr ... un puntatore al byte appena passato l'intero array.

-1

array + 1 significa l'indirizzo dell'array [1] e costa 3 memoria int.

& array + 1 indica l'indirizzo della matrice [0] aggiungi 1;

+0

Sbagliato. Provalo e vedrai. O anche solo guardando l'uscita dell'OP, credo. –

+0

La piscina inglese mi ha frainteso. array è un puntatore che punta l'indirizzo della matrice e (array + 1) è un puntatore che punta l'indirizzo della matrice [1]. & array è l'indirizzo della matrice e quindi aggiungi 1. – hupantingxue

+0

Carl Norum, mi fraintendi. – hupantingxue

0

Arr + 1 dà l'elemento successivo in una matrice, mentre & arr +1 dà l'indirizzo della prossima array di interi

Problemi correlati