【问题标题】:Pointer Initialization (char and int) [duplicate]指针初始化(char和int)[重复]
【发布时间】:2020-06-26 07:11:27
【问题描述】:

C语言如果

char *ptr1 = "something";

是允许的,那为什么不呢

int *ptr2 = {1,2,3};

不允许?

【问题讨论】:

  • 这是语言的设计方式。但不可否认,这将是该语言的一个有用特性。
  • 简单来说,字符串字面量是一个数组对象,而{1,2,3} 只是一个初始化列表。可以指向数组的第一个对象,但不能指向初始化列表。

标签: c pointers initialization


【解决方案1】:

在第一种情况下,

 char *ptr1 = "something";

"something" 归结为指向字符串文字的第一个元素的指针,产生类型 char*,因此类型兼容并且初始化中的赋值是有效的。

另一方面,

int *ptr2 = {1,2,3};

{1,2,3} 是一个大括号括起来的初始化列表,而不是int *,所以它是无效操作并且不允许。

您可以做的实际上是使用compound literal 进行初始化,例如

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

其中ptr2 将指向数组的第一个元素,该元素由大括号括起来的初始值设定项列表中给出的值组成。

【讨论】:

  • 但要注意数组的生命周期:“如果复合文字出现在函数体之外,则对象具有静态存储持续时间;否则,它具有与封闭块关联的自动存储持续时间。”
  • @rici 是的。我认为 OP 更关心语法,这就是我在答案中尝试解决的问题。尽管如此,这是一个非常受欢迎的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
相关资源
最近更新 更多