gpt4 book ai didi

c - 为什么 *pp[0] 等于 **pp

转载 作者:太空狗 更新时间:2023-10-29 15:54:23 26 4
gpt4 key购买 nike

所以我想弄清楚指针,我读了一些关于指针指针的帖子,但我仍然无法弄清楚为什么这个程序可以顺利运行

#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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com