16

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

#include <stdio.h>

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

    p = a;

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

    return 0;
}

打印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;                                                               
}

我希望它能够编译和打印

p0[1] = 1
(*p1)[1] = 1
(*p2)[1] = 1

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

test.c: In function ‘main’:
test.c:11:5: warning: assignment from incompatible pointer type [enabled by default]

为什么这个任务错了?ifp1是指向 an 的指针int并且a是指向 an 的指针int(因为它是 s 数组的名称int),为什么我不能分配&ap1

4

3 回答 3

19

第 11 行是

        p1 = &a;

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

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

你可能想试试

        p1 = &p0;

并阅读c-faq,尤其是第 6 节。

简而言之:数组不是指针指针也不是数组

于 2011-06-24T21:50:30.907 回答
7

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

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

于 2011-06-24T21:51:23.153 回答
0

对于许多操作,aimplicit&a和两者都返回相同的东西:数组中第一项的地址。

您无法获取指针的地址,因为变量不存储指针。a不是一个指针,即使它在某些情况下表现得像一个指针。

于 2011-06-24T21:48:35.667 回答