【问题标题】:Array of Pointer for char Vs Array of pointer for intchar 的指针数组与 int 的指针数组
【发布时间】:2020-12-28 12:20:52
【问题描述】:

为什么第一个声明有效而另一个无效?

    char* string[2] = { "Hello", "Bellow" };

    int* b[2] = { {1,2,3}, {2,3,4} };

【问题讨论】:

  • 因为在第一个中,(字符串文字)数据解析为指针类型。第二种,数据不是指针,定义应该是int b[2][3]
  • 有一个更简单的版本可以显示您所说的行为。只是一个指针,不需要数组来显示它。 const char *foo="blabla"; int *thisDoesNotWork={1,2,3,4};
  • 我知道,但为什么我无法理解
  • 你问为什么语言设计者做出他们所做的决定?

标签: c pointers


【解决方案1】:

除非它是sizeof 或一元& 运算符的操作数,或者是用于在声明中初始化字符数组的字符串字面量,否则为“N 元素”类型的表达式 T" 的数组将被转换或 "decay" 为类型为 "pointer to T" 的表达式,表达式的值将是数组第一个元素的地址。

在声明中

char* string[2] = { "Hello", "Bellow" };

字符串字面量不是用来初始化字符数组,而是一个指针数组,所以两个字符串都“衰减”到指向它们第一个元素的指针,所以你得到

char *[2] = { char *, char * };

在另一个声明中

int* b[2] = { {1,2,3}, {2,3,4} };

{1,2,3}{2,3,4} 不是数组表达式 - 它们是初始化列表,它们不会“衰减”为指针。正如 tstanisl 所示,您可以使用 compound literals like

int *b[2] = { (int[]){1,2,3}, (int[]){2,3,4} };

每个复合文字表达式都会衰减为一个指针。

【讨论】:

    【解决方案2】:

    原因是编译器无法暗示来自{1,2,3} 的类型,而我们希望它是int[3]。您可以使用数组文字手动将其指定为int[3]int[]

    int *b[2] = { (int[]){1,2,3}, (int[]){2,3,4} };
    

    但是,您需要小心,因为文字的生命周期仅绑定到定义它们的块。

    【讨论】:

      猜你喜欢
      • 2017-09-03
      • 2018-04-05
      • 2014-06-28
      • 2016-01-27
      • 2021-01-26
      • 1970-01-01
      • 2021-02-07
      • 2013-12-06
      • 1970-01-01
      相关资源
      最近更新 更多