2011-06-24 301 views
12

鉴于数组的名称实际上是一个指针数组,下面的代码的第一个元素:指向指针的指针和指向数组的指针之间的区别?

#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(因为它是int s的数组的名称),为什么我不能将&a指定为p1

+1

某个时间以前,我写了[对类似问题的回答](http://stackoverflow.com/questions/5181237/confusion-in-data-types-in-a-2d-array),你可能会喜欢。 – pmg

+0

谢谢你的提示! – jpmelos

回答

16

线11

 p1 = &a; 

其中p1具有类型int **a的类型为int[3],对不对?

好吧; &a的类型为int(*)[3]和类型不兼容int**因为编译器告诉你

你可能想尝试

 p1 = &p0; 

而且读the c-faq,特别是第6条

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

+1

这种颠覆了我以前对数组和指针的了解。我很想知道这么多年来我是如何摆脱这种困境的。谢谢你说清楚。 – jpmelos

+1

@jpmelos - 数组和指针的工作方式令人惊讶的微妙,而不是在学习C时很容易明确的。很高兴您明白了。 –

+1

你得到了它,因为数组的行为往往像指针和指针行为阵列... **,但他们是不一样的!**阅读[c-faq](http://c-faq.com /)第6部分:它真的很有趣:) – pmg

0

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

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

+0

那么为什么'p2 =&a'工作,'p1 =&a'不是? – jpmelos

+2

@jpmelos - 因为'&a'的类型是'int(*)[3]'而不是'int **'。 –

+4

不! 'a'并不意味着'&a'有很多事情。它意味着'&a [0]'! – nos

6

a不是int的指针,它在某些情况下衰减。如果&aint **的类型,那么您无法很好地使用它来初始化p2,可以吗?

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

+0

那么,如果不是“a”的第一个元素的地址(这将是我正在查找的指针),那么存储在名称“a”下的是什么? – jpmelos

+3

@jpmelos - 'a'是一个数组。它存储实际的数组元素。数组的名称在传递给函数时衰减为指向第一个元素的指针,但这并不意味着数组实现为指向区域的指针。 'int a [3];'它本身没有指针,只有三个'int's。 –

+0

非常感谢!你的评论帮助我进一步启发了我的想法! – jpmelos