2009-07-05 3 views
11

Ho un puntatore all'array intero di 10. Cosa deve dereferenziare questo puntatore?puntatore di dereferenziamento all'array intero

Esempio:

#include<stdio.h> 

main() 
{ 
    int var[10] = {1,2,3,4,5,6,7,8,9,10}; 
    int (*ptr) [10] = &var; 

    printf("value = %u %u\n",*ptr,ptr); //both print 2359104. Shouldn't *ptr print 1? 


} 

risposta

15

Quello che si dereference è un puntatore a un array. Quindi, il dereferenziamento ti dà l'array. Passare un array a printf (oa qualsiasi funzione) passa l'indirizzo del primo elemento.

Dite printf che si passa un unsigned int (%u), ma in realtà ciò che viene passato è un int*. I numeri che vedi sono gli indirizzi del primo elemento dell'array interpretato come int unsigned.

Naturalmente, questo è un comportamento non definito. Se si desidera stampare un indirizzo, è necessario utilizzare %p e passare un void*.

+0

Oppure è possibile eseguire il cast su un tipo intero appropriato, ad esempio uintptr_t da "", e utilizzare un elemento di formato appropriato, probabilmente PRIuPTR (dice, lavorando da una memoria instabile). –

+0

litb, puoi spiegarmi cosa significa "dereferencing ti dà l'array" significa? È di nuovo puntatore alla matrice? o è l'indirizzo del primo elemento? – chappar

+0

Ti dà lo stesso del solo nominare "var": L'array :) Quindi, 'sizeof (* ptr) == 10 * sizeof (int)', and '& * ptr == int (*) [ 10] ' –

10

Quando si dichiara

int var[10]; 

un riferimento alla var è di tipo puntatore a int(Link to C Faq Relevant's section).

Un riferimento a &var è un puntatore a un array di 10 ints.

La vostra dichiarazione int (*ptr) [10] crea correttamente un puntatore a un array di 10 ints a cui si assegna &var (l'indirizzo di un puntatore a un array di 10 inte) (Link to C Faq Relevant's section).

Con queste cose, si spera che lo ptr stampi l'indirizzo di base del puntatore nell'array di 10 ints.

*ptr sarebbe quindi stampare l'indirizzo del primo elemento delmatrice di 10 int.

Entrambi in questo caso sono uguali e questo è il motivo per cui si vede lo stesso indirizzo.

E sì, **ptr would give you 1.

+0

naturalmente lo stamperebbe correttamente se segui il consiglio di litb. Utilizzare (void *) e% p quando si stampano gli indirizzi. –

-1

Credo che questo potrebbe portare maggiore chiarezza:

(sto usando solo un frammento di codice per ridurre l'ingombro)

Dichiarazione:

int a[5]; 
a[5] = {0,1,2,3,4); 

Indirection

ptr = a <======> ptr = &a[0] 

Dereferenziare

*ptr = *a <======> *ptr = *&a[0] 
        *ptr = a[0] 

quindi, possiamo scrivere:

*(ptr + i) = *(a + i) <======> *(ptr + i) = a[i] 

NOTA: '< =====>' è solo un segno per 'implica '. Niente di speciale!!! Spero di non essermi sbagliato ??