2010-12-13 17 views
5

Frage, warum dies möglich ist:C++ Arrays als Zeiger

char buf[10], *pbuf = buf, **ppbuf = &pbuf; 

und das ist nicht:

char buf[10], **ppbuf = &buf; 

Wie ich verstehe, die zweite Zeile nur eine Abkürzung des ersten ist.

Antwort

4

&buf hat den falschen Typ. &buf ist ein Zeiger auf ein Array von 10 char. ppbuf muss mit einem Zeiger auf einen Zeiger auf eine char initialisiert werden.

In der ersten Initialisierung, während buf ein Array bezeichnet, zerfällt es in eine char* zeigt auf sein erstes Element, so dass die Initialisierung gültig ist.

Sie können auch nicht: char buf[10], **ppbuf = &(&buf[0]); weil &buf[0] ist kein Lvalue, so dass Sie nicht seine Adresse nehmen können.

+0

Der Name eines Arrays ist nicht die Adresse des Feuerelements? Oder funktioniert es nur in den Argumenten der Funktion? – dimayak

+2

@dimayak: Die Array-Variable konvertiert bei Bedarf implizit in die Adresse ihres ersten Elements (a char *).Aber es ist kein Zeiger auf ein char *. –

+4

@dimayak: Nein. Der Name eines Arrays ist der Name eines Arrays. Es verfällt zu einem Zeiger auf sein erstes Element in Ausdruckskontexten anders als als ein Argument zu unären '&' oder 'sizeof'. –

2

buf ist ein Array, kein Zeiger, daher können Sie die Adresse nicht einem Zeiger zuweisen. pbufist ein Zeiger (auf das erste Element des Arrays), so dass Sie seine Adresse einem Zeigerzeiger zuordnen können.

Denken Sie an den Code auf diese Weise:

typedef char* char_p; 

char buf[10]; 
char_p *ppbuf = &buf; // If this was legal... 
*ppbuf = NULL;   // what would this mean? 
5

Sie sind nicht gleichwertig.

*pbuf = buf 

Das heißt, „pbuf ist ein Zeiger char, dessen Wert die Adresse des buf eingeben.“ Da buf ein Array von Zeichen ist, funktioniert dies.

**ppbuf = &pbuf 

Das heißt, „ppbuf ist ein Zeiger auf einen Zeiger char, einzugeben, dessen Wert die Adresse des pbuf“. Da pbuf ein Zeiger auf den Typ char ist, funktioniert das.

**ppbuf = &buf 

Das bedeutet, „ppbuf ein Zeiger auf einen Zeiger auf den Typ char, dessen Wert die Adresse des buf“. Da buf ein Array von Zeichen ist, schlägt dies fehl.

1

Es ist leicht zu sehen, es ist nicht das gleiche, wenn Sie aus starten:

*pbuf = buf 

Da die indirection von pbuf buf enthält pbuf die Adresse buf, also:

pbuf = &buf 

Also:

**ppbuf != pbuf 
**ppbuf != &buf