指针指针和数组指针的区别?

Posted

技术标签:

【中文标题】指针指针和数组指针的区别?【英文标题】:Difference between pointer to pointer and pointer to array? 【发布时间】:2011-09-22 09:05:38 【问题描述】:

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

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

为什么这个分配是错误的?如果p1 是指向int 的指针,而a 是指向int 的指针(因为它是ints 的数组的名称),为什么我不能分配@987654332 @到p1?

【问题讨论】:

前段时间我写了an answer to a similar question你可能会喜欢。 【参考方案1】:

对于许多操作,a 意味着 &amp;a 并且都返回相同的东西:数组中第一项的地址。

你无法获取指针的地址,因为变量不存储指针。 a 不是指针,尽管在某些情况下它的行为类似于指针。

【讨论】:

@jpmelos - 因为&amp;a 的类型是int (*)[3] 而不是int ** 不! a 并不意味着 &amp;a 在很多事情上。它暗示&amp;a[0]【参考方案2】:

第 11 行是

        p1 = &a;

p1 的类型为 int **a 的类型为 int[3],对吧?

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

你可以试试

        p1 = &p0;

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

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

【讨论】:

那种颠覆了我认为我知道的关于数组和指针的一切。我很想知道这么多年我是怎么逃脱的,真的。谢谢你说清楚。 @jpmelos - 数组和指针的工作方式令人惊讶地微妙,在学习 C 的早期阶段并不是很容易弄清楚的。很高兴你明白了。 你侥幸成功了,因为数组通常表现为指针,而指针表现为数组...... 但它们不一样!阅读the c-faq第6节:这真的很有趣:)【参考方案3】:

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

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

【讨论】:

那么,如果不是a 的第一个元素的地址(这将是我要查找的指针),那么在名称a 下存储了什么? @jpmelos - a 是一个数组。它存储实际的数组元素。数组的名称在传递给函数时衰减为指向第一个元素的指针,但这并不意味着数组被实现为指向区域的指针。 int a[3]; 本身没有任何指示,只有三个 ints。 非常感谢!您的评论帮助我进一步启发了我的想法!

以上是关于指针指针和数组指针的区别?的主要内容,如果未能解决你的问题,请参考以下文章

指向指针数组和指针数组的指针之间的区别[重复]

数组指针和指针数组的区别

数组指针和指针数组的区别

指针数组和数组指针的区别

指针数组和数组指针的区别

结构体指针数组和结构体数组指针的区别