2013-04-23 72 views
0
char a[10] = "pqrstuvwxyz"; 
printf("%s", a[3]); 
printf("%s", 3[a]); 

兩個printf都給出相同的輸出。爲什麼?相同的輸出,但不同的條件a [3]和3 [a]

它必須與C編譯器在內存中表示字符串的方式有關,但它是什麼?

我會認爲偏移量乘以char的大小,在這種情況下,他們應該給出不同的輸出。

+5

http://stackoverflow.com/questions/381542/in-c-arrays-why-is-this-true-a5-5a – 2013-04-23 07:49:52

回答

5

因爲那些是等效表達式。索引等同於指針算術。

int x[10]; 
int y = x[1]; 
// same as (and is converted by the compiler to)... 
int y = *(x + 1); 

由於加法是可交換的,這也是一樣的...

int y = *(1 + x); 

而且......

int y = 1[x]; 

在一個側面說明,要調用未定義的行爲通過使用%s格式說明符並傳入char%s期望空終止的字符串,即,以空字符結尾的指向char的指針。注意你的警告。

如果你想在該數組中打印字符串,使用方法:

printf("%s", a + 3); 
// or 
printf("%s", &a[3]); 
+0

這不是傳遞性,而是_commutativity_。 – stefan 2013-04-24 07:42:59

+0

@stefan:我希望我能說這是我第一次犯這個錯誤。謝謝。 – 2013-04-25 03:01:46

1

您需要使用%c格式說明符a[3],因爲它是一個字符,而不是字符串。 %s用於字符串,而不是單個字符。

至於你的問題爲什麼都有相同的輸出,以及Both are Same !!兩者都被解釋爲*(a+3)。在C中,您可以通過兩種方式來完成。

並修改一下你的代碼:

printf("%s", a[3]); 
printf("%s", 3[a]); 

printf("%c", a[3]); 
printf("%c", 3[a]); 

要打印整個字符串,您可以使用:

printf("%s", a); 

OR

printf("%s", &a[0]); 
1

Ca[i]轉化爲*(a+i)內部。 i[a]轉換爲*(i+a)。數組名也作爲c中的指針。所以(a+i)(i+a)給使用地址(使用指針運算)即dereferenced*

相關問題