对指向字符串的指针数组的打印过程感到困惑

时间:2017-08-04 09:57:51

标签: c arrays string pointers printf

#include<stdio.h>
int main(){
    char *names[2] = {"Lord", "Voldemort"};
    printf("%s %s\n",names[0], names[1]);
    return 0;
}

为什么上面的代码有效?我的意思是,它应该打印它们各自索引中包含的字符串的地址,我们应该使用* names [0]和* names [1]。但是为什么它会起作用呢?

2 个答案:

答案 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]);