2011-06-24 300 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