所以我想弄清楚指针,我读了一些关于指针指针的帖子,但我仍然无法弄清楚为什么这个程序可以顺利运行
#include <stdio.h>
#include <assert.h>
int main(){
char* p = "abc";
char** pp[2];
pp[0] = &p;
assert(*pp[0]==**pp);
printf("Comparison: %s, %s\n",**pp, *pp[0]);
return 0;
}
据我所知,现在的内存看起来像这样
Memory Address (hex) Variable name Contents
1000 'a' == 97 (ASCII)
1001 'b' == 98
1002 'c' == 99
1003 0
...
2000-2003 p 1000 hex
...
3000-3003 pp[0] 2000 hex
此时假设我的内存是正确的...... 我希望 *pp[0] 进入内存并说...
所以 pp[0] 指向 p 的地址,即 0x2000,通过取消引用我希望获得地址 0x2000 的内容,在我看来这意味着我将获得 0x1000 但那不是case 因为程序的输出是:
输出
abc, abc
在 **pp 的情况下,我认为它首先取消引用 pp,它将为我们提供 pp 指向的任何内容,这意味着 0x2000 的内容(即 0x1000),然后通过再次取消引用我们得到的内容地址 0x1000
为什么它们会相等?我哪里遗漏了什么
最佳答案
在大多数情况下,如果您有一个数组a
,那么a
就是&a[0]
的缩写。 (有一些异常(exception),例如 sizeof a
或 &a
)。
所以 **pp
实际上意味着 **&pp[0]
。
&pp[0]
是 pp[0]
的地址,所以 *&pp[0]
等同于 pp[0]
,所以**&pp[0]
等同于*pp[0]
。
关于c - 为什么 *pp[0] 等于 **pp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35026135/