【发布时间】:2011-05-24 15:36:25
【问题描述】:
为什么会这样:
char buf[10], *pbuf = buf, **ppbuf = &pbuf;
这不是:
char buf[10], **ppbuf = &buf;
据我了解,第二行只是第一行的简写。
【问题讨论】:
为什么会这样:
char buf[10], *pbuf = buf, **ppbuf = &pbuf;
这不是:
char buf[10], **ppbuf = &buf;
据我了解,第二行只是第一行的简写。
【问题讨论】:
buf 是一个数组,而不是指针,因此您不能将其地址分配给指针指针。 pbuf 是一个指针(指向数组的第一个元素),所以你可以将它的地址分配给一个指针指针。
这样想代码:
typedef char* char_p;
char buf[10];
char_p *ppbuf = &buf; // If this was legal...
*ppbuf = NULL; // what would this mean?
【讨论】:
&buf 的类型错误。 &buf 是一个指向 10 个数组的指针 char。 ppbuf 必须使用指向 char 的指针来初始化。
在第一次初始化中,虽然buf 表示一个数组,但它会衰减为指向其第一个元素的char*,因此初始化是有效的。
你也不能这样做:char buf[10], **ppbuf = &(&buf[0]); 因为&buf[0] 不是左值所以你不能取它的地址。
【讨论】:
& 或 sizeof 的参数。
它们不相等。
*pbuf = buf
这意味着,“pbuf 是指向类型char 的指针,其值是buf 的地址。”因为buf 是一个字符数组,所以这行得通。
**ppbuf = &pbuf
这意味着,“ppbuf 是指向类型char 的指针,其值是pbuf 的地址。”因为pbuf 是一个指向char 类型的指针,所以这是可行的。
**ppbuf = &buf
这意味着,“ppbuf 是指向类型char 的指针,其值是buf 的地址。”由于buf 是一个字符数组,因此失败。
【讨论】:
从以下开始很容易看出不一样:
*pbuf = buf
由于pbuf的间接寻址是buf,所以pbuf包含了buf的地址,因此:
pbuf = &buf
所以:
**ppbuf != pbuf
**ppbuf != &buf
【讨论】: