指针指针和指向数组的指针之间的区别?

jpm*_*los 13 c arrays pointers declaration dereference

鉴于数组的名称实际上是指向数组的第一个元素的指针,以下代码:

#include <stdio.h>

int main(void)
{
    int a[3] = {0, 1, 2};
    int *p;

    p = a;

    printf("%d\n", p[1]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

1按预期打印.

现在,鉴于我可以创建一个指向指针的指针,我写了以下内容:

#include <stdio.h>                                                              

int main(void)                                                                  
{                                                                               
        int *p0;                                                                
        int **p1;                                                               
        int (*p2)[3];                                                           
        int a[3] = {0, 1, 2};                                                   

        p0 = a;                                                                 
        p1 = &a;                                                                
        p2 = &a;                                                                

        printf("p0[1] = %d\n(*p1)[1] = %d\n(*p2)[1] = %d\n",                    
                        p0[1], (*p1)[1], (*p2)[1]);                             

        return 0;                                                               
}
Run Code Online (Sandbox Code Playgroud)

我希望它能够编译和打印

p0[1] = 1
(*p1)[1] = 1
(*p2)[1] = 1
Run Code Online (Sandbox Code Playgroud)

但相反,它在编译时出错,说:

test.c: In function ‘main’:
test.c:11:5: warning: assignment from incompatible pointer type [enabled by default]
Run Code Online (Sandbox Code Playgroud)

为什么这个任务错了?如果p1是一个指针的指针inta是一个指针int(因为它是一个数组名intS),我为什么不能分配&ap1

pmg*_*pmg 16

第11行是

        p1 = &a;
Run Code Online (Sandbox Code Playgroud)

哪里p1有类型int **,a有类型int[3],对吧?

好; &a具有类型,int(*)[3]并且该类型与int**编译器告诉您不兼容

你可能想试试

        p1 = &p0;
Run Code Online (Sandbox Code Playgroud)

并阅读c-faq,特别是第6节.

简而言之:数组不是指针,指针不是数组.

  • 这种颠覆了我以为我知道的关于数组和指针的一切。我想知道我是如何逃脱这么多年的,真的。谢谢你说清楚。 (2认同)

Chr*_*utz 6

a不是指针int,它在某些情况下会衰减.如果&a是类型int **你不能很好地使用它来初始化p2,是吗?

你需要做p1 = &p0;你想要的效果."指向指针"意味着"在这个地址,你会找到一个指针".但是如果你查看地址&a,你会发现一个数组(显然),所以int **不是正确的类型.

  • @jpmelos - `a`是一个数组.它存储实际的数组元素.当传递给函数时,数组的名称衰减为指向第一个元素的指针,但这并不意味着数组被实现为指向区域的指针.`int a [3];`它自己没有指针,只有三个`int`s. (3认同)