2013-03-05 54 views
3

我想了解數組和指針之間存在的特殊關係,即沒有括號的數組名稱總是指向數組的第一個元素。char數組和指針 - 有人可以解釋下面的輸出嗎?

在Linux系統上,我得到這個與C程序:

char name[7] = "unique"; 

printf("\nAddress stored of name: %p", name); 
printf("\nAddress stored of name: %s", name); //Conflict 
printf("\nAddress of name[0]: %p", &name[0]); 

//dereferencing the pointer 
printf("\nValue of name[0]: %c", *name); 
printf("\nValue of name[1]: %c", *(name+1)); 

輸出是:

Address stored of name: 0xbff68131 
Address stored of name: unique 
Address of name[0]: 0xbff68131 
Value of name[0]: u 
Value of name[1]: n 

我瞭解在上面的輸出以外的所有的代碼行的輸出其中//衝突。換句話說,如果名稱相當於&名稱[0]爲每個陣列和指針之間的特殊關係,那麼爲什麼簡單地改變格式說明(從%P爲%s)打印陣列的實際值。如果確實如此,那麼這是否意味着名稱,&名稱[0]*名稱是否都等同?

我會至少期望它(/衝突)打印一些其他(垃圾?)值,但不是數組的實際值。

+2

「爲什麼只是更改格式說明...打印實際值」?因爲這是選擇不同格式說明符的關鍵。不同的格式說明符告訴'printf'以不同的方式處理相應的參數。 – jamesdlin 2013-03-05 02:53:21

+0

或者想一想:如果你使用'%d'打印'int'而不是'%X',那麼對於相同的數值你會得到不同的輸出。那麼,爲什麼讓你感到驚訝的是,不同的格式說明符可能會打印對同一地址的不同解釋? – jamesdlin 2013-03-05 03:01:35

+0

@jamesdlin我明白,不同的格式說明符會打印不同的值,我承認已經在我的問題 - 「我會至少期望它(/衝突)打印一些其他(垃圾?)值,但不是實際值陣列「。也許我誤解了這裏的點和數組關係。 – modest 2013-03-05 03:23:26

回答

2
%s 

這告訴printf治療參數作爲一個指針到包含字符陣列的存儲器位置,並打印每一個,直到\0遇到。

%p 

這對待arguement作爲存儲位置,並在十六進制打印其價值,因爲你所看到的。

你稱之爲「衝突」實際上是更重要的用途,並且是打印C字符串的正確方法。

-1

當使用數組表達式代替指針表達式時,數組表達式轉換爲指向第一個元素的指針。指向第一個元素的指針是array+0&array[0],第一個元素是*(array+0)array[0]

printf("\nAddress stored of name: %p", name);中,數組表達式轉換爲指向第一個元素的指針。對於printf("\nAddress stored of name: %s", name);同樣,名稱被轉換爲指向name[0]的指針。在指向name[1]的指針中添加1個結果。在一個指針加入2個結果name[2]

這可能是值得指出的是,操作者array[n]實際上是一個pointer[n]算子,即array被轉換到一個指向第一個表達式。 n被添加到指針中以產生指向第n個元素的指針,然後解除引用以從其指針產生第n個元素。這是%s格式說明符的結果。但是,%p格式說明符根本不執行任何解引用。

如果這是真的話,那麼這是否意味着名字,&名[0]和 *名稱都是等價的?

name號是一個數組表達:sizeof name將導致7. &name[0]是一個指針表達式轉化爲「指針以名稱[0]」:sizeof &name[0]將導致sizeof (char *)。​​是一個char表達式,可翻譯爲「按名稱指向的字符」。 sizeof *name將導致1.

相關問題