我正在努力理解指针,阅读了一些关于指向指针的帖子,但仍然无法弄清楚为什么这个程序可以正常运行。
#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,但实际情况并非如此,因为程序的输出是:
输出
abc, abc
在pp的情况下,我认为它首先会取消引用pp,这将给我们pp指向的任何内容,也就是0x2000的内容(即0x1000),然后再次取消引用,我们得到地址0x1000的内容。
为什么它们相等?我错过了什么地方吗?
pp
可以缩写为&pp[0]
,而且**&pp[0]
显然与*pp[0]
相同(因为无论何时*&x
都等同于x
)。 - user253751