【问题标题】:Confused about the printing procedure of array of pointers to string对字符串指针数组的打印过程感到困惑
【发布时间】:2017-08-04 09:57:50
【问题描述】:
#include<stdio.h>
int main(){
    char *names[2] = {"Lord", "Voldemort"};
    printf("%s %s\n",names[0], names[1]);
    return 0;
}

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

【问题讨论】:

  • %s 需要一个指向字符的 指针。当然,您也可以打印地址,但是您必须使用%p

标签: c arrays string pointers printf


【解决方案1】:

如果你有一个整数数组,比如

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

那么如果使用 used 例如你会得到什么? values[1]?您将获得数组中的第二个 element。打印这个 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][0]。换句话说,它为您提供names[1] 指向的字符串中的第一个字符

【讨论】:

    【解决方案2】:

    names[0]names[1] 都是 const char* 类型。

    当您将%sconst char* 参数一起使用时,printf 会输出从参数开头开始的字符,直到达到\0

    如果你想要 地址 然后使用

    printf("%p %p\n", (const void*)names[0], (const void*)names[1]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多