char a[10] = "pqrstuvwxyz";
printf("%s", a[3]);
printf("%s", 3[a]);
两个printfs 都给出相同的输出。为什么?
这一定与 C 编译器在内存中表示字符串的方式有关,但它是什么?
我会认为偏移量乘以 char 的大小,在这种情况下它们应该给出不同的输出。
char a[10] = "pqrstuvwxyz";
printf("%s", a[3]);
printf("%s", 3[a]);
两个printfs 都给出相同的输出。为什么?
这一定与 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]因为它是一个字符,而不是字符串。%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]);
InC a[i]转换为*(a+i)内部。i[a]被转换为*(i+a)。数组名称也充当 c 中的指针。所以(a+i)或(i+a)给出一个正在dereferenced使用的地址(使用指针算术)*