<分区>
char a[10] = "pqrstuvwxyz";
printf("%s", a[3]);
printf("%s", 3[a]);
printf
都给出相同的输出。为什么?
这肯定与 C 编译器在内存中表示字符串的方式有关,但它是什么?
我本以为偏移量乘以 char 的大小,在这种情况下它们应该给出不同的输出。
标签 c
<分区>
char a[10] = "pqrstuvwxyz";
printf("%s", a[3]);
printf("%s", 3[a]);
printf
都给出相同的输出。为什么?
这肯定与 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]);
关于c - 输出相同但条件 a[3] 和 3[a] 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16163786/