首页 > 解决方案 > 为什么在初始化指针时必须将数组转换为 type[]?

问题描述

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

char *string = "Hello World!";

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

char *string = {'H', 'e', 'l', 'l', 'o', '\0'};

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

标签: arrayscpointers

解决方案


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

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

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

你说如果你施放它会起作用。如果你是这个意思:

char *string = (char []){'H', 'e', 'l', 'l', 'o', '\0'};

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


推荐阅读