我们在初始化指针时不强制转换字符串:
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[]以同样的方式初始化一个数组,我们就不必强制转换。我在这里假设编译器看到初始化值是什么,为什么在初始化指针时没有看到它?
string 是一个指针,而不是一个数组,所以它需要一个作为指针的初始化程序。
第一个代码片段没问题,因为字符串文字具有数组类型,并且该数组衰减为指向其第一个元素的指针。
第二个不好,因为您将一组字符分配给指针。因为string不是数组或结构,所以只使用初始化列表的第一个成员。所以你有一个字符常量,它有 type int,你试图分配给一个指针。
你说如果你投它就行。如果你是这个意思:
char *string = (char []){'H', 'e', 'l', 'l', 'o', '\0'};
Run Code Online (Sandbox Code Playgroud)
然后你所拥有的实际上是右侧的复合文字,它具有数组类型,并且像第一个示例一样,数组衰减为指向其第一个成员的指针。