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

标签 c pointers dereference

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

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

相关文章:

c++ - 更改范围的字符格式

c - 使用 header 的 turbo c 项目文件中的链接器错误

c++ - 为什么不能将范围解析与成员指针取消引用一起使用?

c - 为什么此 C 代码片段不会导致段错误?

C++:为什么转换为指针然后取消引用有效?

将字符串复制到结构体 C 中

c - 使用 GLEW 2.0 的 glewInit 段错误

c++ - OpenCV cv::Mat to short*(避免 memcpy)

c - 以两种不同的方式在升序数组中搜索值

c++ - 引用指针的内存泄漏