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.
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.
&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.
buf es una matriz, no un puntero, por lo que no puede asignar su dirección a un puntero. pbuf
es 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?
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.
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
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
@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 *. –
@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'. –