2013-04-21 16 views
5

prega di consultare il seguente frammento di codice:vogliono capire un comportamento C gamma

int main() 
{ 

    int arr[] = { 0,3 , 4,28,1198}; 
    for(int i=0;i<5;i++) 
    printf("\n arr[i] %u \n" , arr+i); 
    printf("\n *******************\n"); 
    printf("%u ", &arr+1); 

    return 1; 

} 

Quando viene eseguito, emette:

arr[i] 3219650892 

arr[i] 3219650896 

arr[i] 3219650900 

arr[i] 3219650904 

arr[i] 3219650908 

******************* 
3219650912 

Sembra che mi sta mostrando l'indirizzo dell'ultimo elemento aggiunto con 1 altro numero intero che sembra essere strano. Sento che avrebbe dovuto darmi l'indirizzo del secondo elemento.

Potete aiutarmi a capire questo comportamento?

+0

& arr significa (char *) [5], +1 significa +5 indice. – BLUEPIXY

risposta

10

Per capire ciò, confrontare il significato di arr con &arr.

arr è il nome dell'array. C ha una regola che un'espressione di matrice viene convertita in un puntatore al primo elemento (tranne in alcune situazioni particolari che non si applicano qui). Quindi arr viene convertito in &arr[0], che è l'indirizzo del primo elemento. Questo è un puntatore a int, quindi, quando ne aggiungi 1, si ottiene un puntatore al successivo int. Pertanto, gli incrementi successivi a questo puntatore incrementano gli elementi dell'array.

Al contrario, &arr è un puntatore all'array. * L'indirizzo iniziale dell'array e l'indirizzo iniziale del primo elemento sono gli stessi, ma hanno tipi diversi. Il tipo di &arr è "puntatore a matrice di cinque int". Quando aggiungi 1 a questo, ottieni un puntatore all'array successivo di cinque int. Cioè, l'indirizzo viene incrementato dalla dimensione di un intero array di cinque int.

Per inciso, non è appropriato utilizzare un identificatore %u per stampare gli indirizzi. Si dovrebbe usare %p e convertire gli indirizzi void *, come ad esempio:

printf("%p ", (void *) (&arr+1)); 

nota

* Questa è una di quelle situazioni particolari: Quando un array viene utilizzato con &, la conversione è non fatto. In &arr, arr è la matrice, non un puntatore e &arr è il suo indirizzo.

3

&arr+1

&arr è un puntatore alla matrice arr, così &arr + 1 punti all'indirizzo dell'ultimo elemento della matrice arr+ 1 elemento. Questo è arr l'ultimo elemento è &arr[4] quindi &arr + 1 è lo stesso indirizzo di &arr[5] (ma il tipo è diverso).

+0

Ben spiegato. +1. – Maroun

0

& arr fornisce il puntatore all'array di 5 numeri interi.

quindi, & arr + 1 punti all'array successivo di 5 numeri interi.