#include<stdio.h>
int main(){
char *names[2] = {"Lord", "Voldemort"};
printf("%s %s\n",names[0], names[1]);
return 0;
}
为什么上面的代码有效?我的意思是,它应该打印它们各自索引中包含的字符串的地址,我们应该使用* names [0]和* names [1]。但是为什么它会起作用呢?
答案 0 :(得分:3)
如果你有一个像
这样的整数数组int values[2] = { 1, 2 };
那么如果使用例如,你会得到什么? values[1]
?您将在数组中获得第二个 元素 。打印此values
数组就像
printf("%d %d\n", values[0], values[1]);
你和我在一起这么远吗?
现在回到你的阵列。如果您使用names[1]
那么您会得到什么?您仍获取数组中的第二个 元素 。第二个元素是什么?它是指向char
(即char *
)的指针。什么可以指向char
的指针? 字符串 。
带有"%s"
的{{1}}格式需要一个字符串,更具体地说是printf
。这就是你作为参数提供的内容。
如果您使用char *
之类的解除引用运算符,那么感谢operator precedence它等于*names[1]
,等于*(names[1])
。换句话说,它为names[1][0]
指向的字符串中的第一个字符提供。
答案 1 :(得分:1)
names[0]
和names[1]
都是const char*
类型。
当%s
使用const char*
参数时,printf
会输出从参数开头开始的字符,直到达到\0
。
如果您需要地址,请使用
printf("%p %p\n", (const void*)names[0], (const void*)names[1]);