为什么在初始化指针时必须将数组强制转换为 type[]?

Kai*_*aha 2 c arrays pointers

我们在初始化指针时不强制转换字符串:

char *string = "Hello World!";
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试显式定义一个数组(无论它是什么),编译器都会给我一个类型不兼容的警告:

char *string = {'H', 'e', 'l', 'l', 'o', '\0'};
Run Code Online (Sandbox Code Playgroud)

投射到char[]作品,但我想知道为什么我们必须投射?编译器没有看到初始化值{'H', 'e', 'l', 'l', 'o', '\0'}已经是一个数组吗?如果我们string[]以同样的方式初始化一个数组,我们就不必强制转换。我在这里假设编译器看到初始化值是什么,为什么在初始化指针时没有看到它?

dbu*_*ush 5

string 是一个指针,而不是一个数组,所以它需要一个作为指针的初始化程序。

第一个代码片段没问题,因为字符串文字具有数组类型,并且该数组衰减为指向其第一个元素的指针。

第二个不好,因为您将一组字符分配给指针。因为string不是数组或结构,所以只使用初始化列表的第一个成员。所以你有一个字符常量,它有 type int,你试图分配给一个指针。

你说如果你投它就行。如果你是这个意思:

char *string = (char []){'H', 'e', 'l', 'l', 'o', '\0'};
Run Code Online (Sandbox Code Playgroud)

然后你所拥有的实际上是右侧的复合文字,它具有数组类型,并且像第一个示例一样,数组衰减为指向其第一个成员的指针。

  • @Kaiyaha 问题的答案不仅可以帮助您,还可以帮助任何可能有相同问题的人找到这篇文章。 (2认同)