这个符号在C语言中代表什么?

5
int *w;
int **d;

d = &w;

“d”存储到底是什么?


5个回答

5

赋值后,**d*w 相同。 d 是一个指向整型指针的指针;它所指向的整型指针是 w。因此,*dw**d*w


2
不,**d*w并不相同 -- 至少它们的值不同。虽然我想我知道你想说什么(它们最终都指向同一个变量),但我认为那有点误导。 - Noldorin
@Noldorin,能否指出C++标准文档中说明取消引用的指针与其指向的内存不是相同值的部分? - Franci Penov
我认为这个答案很令人困惑,因为它谈到了解引用运算符,但原始代码并没有解引用任何东西。指针声明限定符恰好使用相同的*字符。我相信这就是Noldrin所指的。这两个声明不等价,尽管两次解引用d与一次解引用w相同,但我不认为在这种情况下这是一个有用的答案,并且想知道为什么它被标记为“已接受”。 - Clifford
@Franci:我觉得你误解了我的评论。另外,我们在谈论C语言,而不是C++。 @Clifford:这正是我所指的……我同意这个答案会在这个问题上造成混淆。如果楼主正在阅读这篇文章,我敦促你至少阅读我的回答或杰克·劳埃德的回答(基本上是正确的)。 - Noldorin
仅针对此代码片段,如果您解引用 **d,可能会出现分段错误或一些垃圾整数值,因为 w 未正确初始化。 - qunying

3

int ** 表示 “指向一个指向 int 的指针”(也称为双重指针)。

现在,int *w 只表示一个指向 int 的指针,因此赋值语句 d = &w 表示:“将 w 的地址(它本身就是一个指针/地址)分配给 d。”


3

**d的值与*w的值相同;*d等于保存在w中的指针值;因为d是指向指向int的指针,所以必须解除两次引用才能获得实际值。


3

w存储一个int的地址。d存储一个指向int的指针的地址(除非在这种情况下它存储了一个随机值,因为它没有被赋值),在这种情况下它存储了d的地址。


0

**d 是一个指向 int 指针的指针,因此当你说 d=&w 时,**d 将具有指针 *w 的地址,但除非你已经声明了 d=&w 并且只是声明了 int *w int **d,否则它没有任何意义,除了: int *w 是一个指向 int 的指针,int **d 是一个指向 int 指针的指针,但这并不意味着 d 将存储 w 的地址。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接