С ++ массивы как указатели вопроса - PullRequest
5 голосов
/ 13 декабря 2010

Почему это возможно:

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

, а это не так:

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

Как я понимаю, вторая строка - это просто сокращение первой.

Ответы [ 4 ]

5 голосов
/ 13 декабря 2010

Они не эквивалентны.

*pbuf = buf

Это означает, что "pbuf является указателем на тип char, значением которого является адрес buf."Поскольку buf является массивом символов, это работает.

**ppbuf = &pbuf

Это означает, что "ppbuf - это указатель на указатель на тип char, значение которого является адресом pbuf«.Поскольку pbuf является указателем на тип char, это работает.

**ppbuf = &buf

Это означает, что "ppbuf является указателем на указатель на тип char, значение которого является адресомbuf «.Так как buf является массивом символов, это терпит неудачу.

4 голосов
/ 13 декабря 2010

&buf имеет неправильный тип.&buf - указатель на массив 10 char.ppbuf должен быть инициализирован указателем на указатель на char.

При первой инициализации, хотя buf обозначает массив, он затухает до char*, указывая на его первый элементпоэтому инициализация действительна.

Вы также не можете сделать: char buf[10], **ppbuf = &(&buf[0]);, потому что &buf[0] не является lvalue, поэтому вы не можете взять его адрес.

2 голосов
/ 13 декабря 2010

buf - это массив, а не указатель, поэтому вы не можете назначить его адрес указателю указателя.pbuf является указателем (на первый элемент массива), так что вы можете назначить его адрес указателю указателя.

Подумайте над кодом этогопуть:

typedef char* char_p;

char buf[10];
char_p *ppbuf = &buf;  // If this was legal...
*ppbuf = NULL;         // what would this mean?
1 голос
/ 13 декабря 2010

Легко видеть, что это не то же самое, когда вы начинаете с:

*pbuf = buf

Так как pbuf имеет адрес перенаправления buf, pbuf содержит адрес buf, таким образом:

pbuf = &buf

Итак:

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