0
char a[10] = "pqrstuvwxyz";
printf("%s", a[3]);
printf("%s", 3[a]);

两个printfs 都给出相同的输出。为什么?

这一定与 C 编译器在内存中表示字符串的方式有关,但它是什么?

我会认为偏移量乘以 char 的大小,在这种情况下它们应该给出不同的输出。

4

3 回答 3

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]);
于 2013-04-23T07:50:18.047 回答
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);

或者

printf("%s", &a[0]);
于 2013-04-23T07:50:10.667 回答
1

InC a[i]转换为*(a+i)内部。i[a]被转换为*(i+a)。数组名称也充当 c 中的指针。所以(a+i)(i+a)给出一个正在dereferenced使用的地址(使用指针算术)*

于 2013-04-23T07:50:47.113 回答