【发布时间】:2016-05-03 17:48:16
【问题描述】:
所以我试图弄清楚指针,我阅读了一些关于指针指针的帖子,但我仍然无法弄清楚为什么这个程序可以毫无问题地运行
#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
为什么他们会是平等的?我在哪里错过了什么
【问题讨论】:
-
因为
pp可以是&pp[0]的缩写,而**&pp[0]显然与*pp[0]相同(因为*&x与x相同,只要它有效)。
标签: c pointers dereference