char a[10] = "pqrstuvwxyz";
printf("%s", a[3]);
printf("%s", 3[a]);
兩個printf
都給出相同的輸出。爲什麼?相同的輸出,但不同的條件a [3]和3 [a]
它必須與C編譯器在內存中表示字符串的方式有關,但它是什麼?
我會認爲偏移量乘以char的大小,在這種情況下,他們應該給出不同的輸出。
char a[10] = "pqrstuvwxyz";
printf("%s", a[3]);
printf("%s", 3[a]);
兩個printf
都給出相同的輸出。爲什麼?相同的輸出,但不同的條件a [3]和3 [a]
它必須與C編譯器在內存中表示字符串的方式有關,但它是什麼?
我會認爲偏移量乘以char的大小,在這種情況下,他們應該給出不同的輸出。
因爲那些是等效表達式。索引等同於指針算術。
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]);
這不是傳遞性,而是_commutativity_。 – stefan 2013-04-24 07:42:59
@stefan:我希望我能說這是我第一次犯這個錯誤。謝謝。 – 2013-04-25 03:01:46
您需要使用%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]);
在C
a[i]
轉化爲*(a+i)
內部。 i[a]
轉換爲*(i+a)
。數組名也作爲c中的指針。所以(a+i)
或(i+a)
給使用地址(使用指針運算)即dereferenced
*
http://stackoverflow.com/questions/381542/in-c-arrays-why-is-this-true-a5-5a – 2013-04-23 07:49:52