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

标签 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]。但为什么它能起作用呢?

最佳答案

如果你有一个像这样的整数数组

int values[2] = { 1, 2 };

那么如果使用例如,你会得到什么? 值[1]?您将获得数组中的第二个元素。打印此 values 数组的方式如下:

printf("%d %d\n", values[0], values[1]);

到目前为止你已经和我在一起了吗?

现在恢复你的阵列。如果你使用 names[1] 你会得到什么?您仍然获得数组中的第二个元素。第二个元素是什么?它是一个指向 char 的指针(即 char *)。指向 char 的指针可以用作什么?一个字符串

带有 printf"%s" 格式需要一个字符串,更具体地说是一个 char * 。这正是您作为参数给出的内容。

<小时/>

如果您使用像 *names[1] 这样的解引用运算符,那么感谢 operator precedence它等于*(names[1]),而*(names[1])又等于names[1][0]。换句话说,它为您提供 names[1] 指向的字符串中的第一个字符

关于对字符串指针数组的打印过程感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45503776/

相关文章:

c - 这行代码 `ptr=(char *)&a;` 实际上是做什么的?

c - LPC12xx I2C vector 到服务例程

c++ - 反转字符串?一个更优化的方式

java - 如何在 Java 中连接来自不同类的数组?

java - 按字符串属性对自定义类型数组进行排序?

c - 反序列化错误

ios - swift 将从@escaping 接收到的值分配给另一个类中的实例变量

python - 在 Python 中将十六进制字符串拆分为 block

android - 以编程方式更改 R.string 的值?

编译错误 - 解析错误和不完整类型