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