2010-12-13 14 views
5

Por qué esto es posible:C++ matrices como punteros cuestionan

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

y esto no es:

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

Según tengo entendido, la segunda línea es simplemente una abreviatura de la primera.

Respuesta

4

&buf tiene el tipo incorrecto. &buf es un puntero a una matriz de 10 char. ppbuf tiene que inicializarse con un puntero a un puntero a char.

En la primera inicialización, mientras que buf denota una matriz, se descompone en char* apuntando a su primer elemento por lo que la inicialización es válida.

Tampoco puede hacer: char buf[10], **ppbuf = &(&buf[0]); porque &buf[0] no es un lvalue por lo que no puede tomar su dirección.

+0

El nombre de una matriz no es la dirección de su elemento más resistente? ¿O funciona solo en los argumentos de la función? – dimayak

+2

@dimayak: la variable de matriz convierte implícitamente a la dirección de su primer elemento (a char *), cuando corresponda.Pero no es un puntero a un char *. –

+4

@dimayak: No. El nombre de una matriz es el nombre de una matriz. Se desintegra a un puntero a su primer elemento en contextos de expresión que no sea como un argumento para unary '&' o 'sizeof'. –

2

buf es una matriz, no un puntero, por lo que no puede asignar su dirección a un puntero. pbufes un puntero (al primer elemento de la matriz), por lo que puede asignar su dirección a un puntero.

Piense en el código de esta manera:

typedef char* char_p; 

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

No son equivalentes.

*pbuf = buf 

Eso significa, "pbuf es un puntero de tipo char, cuyo valor es la dirección de buf." Desde buf es una matriz de caracteres, esto funciona.

**ppbuf = &pbuf 

Eso significa, "ppbuf es un puntero a un puntero de tipo char, cuyo valor es la dirección de pbuf." Dado que pbuf es un puntero al tipo char, esto funciona.

**ppbuf = &buf 

Esto significa, "ppbuf es un puntero a un puntero de tipo char, cuyo valor es la dirección de buf." Como buf es una matriz de caracteres, esto falla.

1

Es fácil ver que no es el mismo cuando se inicia a partir de:

*pbuf = buf 

Dado que la vía indirecta de pBuf se buf, pBuf contiene la dirección del buf, por lo tanto:

pbuf = &buf 

Por lo tanto:

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