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