2013-06-29 28 views
2

這是工作正常代碼...在這個代碼的一些疑惑...(指針)

int main() 
{ 
    char c[]={'\t','\n','\0'}; 
    int i; 
    char *p,*str; 
    str=c; 
    p=&c[1]; 
    printf("%d\n%d\n",*p,*str); 
    system("pause"); 
    return 0; 
} 

我的問題是爲什麼會str=c;,而不是str=&c;(這給誤差)和其p=&c[1]; 而不是p=c[1]

回答

3

在表達式中使用時,對類型爲array-of-T(即數組名稱)的對象的引用會衰減爲指向其第一個元素的指針。 [1]這樣的指針的結果類型是pointer-to-T

此外,當您通過索引訪問數組元素時,它將被解除引用。這就是爲什麼你使用&來獲得它的地址。

要包起來,在表達式你張貼

  • c相當於&c[0]
  • c[1]是在該陣列中第二位置處的值。 &c[1]是它的存儲器地址,即指向它的指針。

[1]有四個明顯的例外這樣一個事實:當陣列是一個sizeof&或操作數 - 因爲C11 - _Alignof操作者,或當它是一個字符串初始化爲一個字符數組。參考:http://c-faq.com/aryptr/aryptrequiv.html

+2

請dowvoters,解釋自己。 –

+2

數組不是指針。 http://c-faq.com/aryptr/aryptr2.html –

+4

不,數組名稱不是指針。它被轉換爲一個指針,除非它是sizeof或address('&')操作符的操作數,或者是一個用於初始化數組的字符串文字。 –

4

當您進行作業時,作業的兩面都需要爲類型兼容

在某些情況下,數組的名稱會隨着指向其第一個元素的指針而衰減。所以c返回指針到一個炭,即char *&c給出了一個陣列,這顯然不是類型char *類型的strchar*)的地址,類型不匹配給你在編譯錯誤形式的診斷。

&c[1]給你一個char *c[1]給出該指數的值,即:char。在這種情況下,類型p再次是char *,因此觀察結果。


良好閱讀:
How do I use arrays in C++?

+1

它不僅僅是一個數組的名稱,它被轉換爲指向其第一個元素的指針。 **任何**數組表達式都被轉換爲指向其第一個元素的指針(除非它是sizeof','''或'_Alignof'的操作數,或者是一個初始化數組的字符串文字)。所以,如果'x'被聲明爲'int x [3] [4] [5]',那麼'*(x [2] +1)'被轉換爲一個指向'int'的指針,因爲它是一個指針到一個包含五個'int'的數組。 (轉換結果與'&x [2] [1] [0]'相同。) –

+0

@EricPostpischil:True。 –