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.
fonte
2012-08-08 04:37:53
ho imparato molto dalla vostra risposta. Grazie. –
Con '% p', devi lanciare i puntatori su' void * '. –