2016-02-25 8 views
5

Stavo lavorando con i puntatori e ho trovato un problema. Finora so che quando creiamo un array di qualsiasi tipo di dati, il nome dell'array è in realtà un puntatore (forse un puntatore statico) puntato verso il primissimo indice dell'array. corretta?Indirizzo dell'array VS pointer-to-pointer: non è lo stesso?

Quindi quello che sto cercando di realizzare è quello di creare un altro puntatore che può contenere l'indirizzo del nome di matrice (cioè un puntatore verso un altro puntatore che nel mio caso è il nome della matrice)

Per esempio:

char name[] = "ABCD"; // name holding the address of name[0] 
char *ptr1 = name;  // When this is possible 
char **ptr2 = &name; // Why not this. It give me error that cannot convert char(*)[5] to char** 

Sto utilizzando i blocchi di codice come IDE.

+13

No, No, No. Una matrice non è un puntatore. Può decadere da un puntatore quando viene passato a una funzione ma non è un puntatore. Non pensare agli array come indicatori. – NathanOliver

+1

Quindi intendi quando ho scritto char * ptr1 = name; effettivamente ha fatto char * ptr1 = & name [0]; ? e il nome stesso non è una variabile puntatore separata? –

+0

Gli array non sono puntatori "rigidi". Il puntatore è una posizione di memoria che contiene un indirizzo. Quando si usa un compilatore di array si sa solo quale indirizzo è, ma non è memorizzato da nessuna parte e non può essere sovrascritto. La tua seconda affermazione implicava che potevi fare * ptr2 = somethingelse, che non può essere fatto. – nsilent22

risposta

8

TL; DR Gli array non sono puntatori.

Nel codice, &name è un puntatore al la serie di 5 char s. Questo non è lo stesso di un puntatore a un puntatore a char. È necessario modificare il codice per

char (*ptr2)[5] = &name; 

o,

char (*ptr2)[sizeof(name)] = &name; 

FWIW, in alcuni casi (ad esempio, passare una matrice come argomento di funzione), il nome della matrice decade al puntatore a il primo elemento dell'array.

+0

invece di usare '5' non dovremmo usare' sizeof (nome) '? – NathanOliver

+0

Due domande: 1) Che cos'è TL; DR e 2) Intendevi un array di 5 'char's? –

+0

@NathanOliver Migliore uno, in realtà :) –

2

Se si desidera utilizzare puntatore a puntatore, è possibile utilizzare questo:

int main(void){ 
    char name[] = "ABCD"; 
    char *ptr1 = name; 
    char **ptr2 = &ptr1; 
    std::cout << *ptr1 << std::endl; 
    std::cout << **ptr2 << std::endl; 
} 

applausi.

+0

Sì, questo è un modo per uscire da questo pasticcio, ma in realtà stavo cercando di capire questo perché quello che sto cercando di fare non è possibile. –