2013-04-23 78 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*

相关问题