arrays - 为什么在初始化指针时必须将数组转换为 type[]?
问题描述
初始化指针时,我们不强制转换字符串:
char *string = "Hello World!";
但是,如果我尝试显式定义一个数组(无论它是什么),编译器会给我一个类型不兼容的警告:
char *string = {'H', 'e', 'l', 'l', 'o', '\0'};
铸造char[]
作品,但我想知道为什么我们必须铸造?编译器没有看到初始化值{'H', 'e', 'l', 'l', 'o', '\0'}
已经是一个数组吗?如果我们以同样的方式初始化一个数组string[]
,我们不必强制转换。我在这里假设编译器看到初始化值是什么,为什么在初始化指针时看不到它?
解决方案
string
是一个指针,而不是一个数组,所以它需要一个作为指针的初始化器。
第一个代码片段是可以的,因为字符串文字具有数组类型,并且该数组衰减为指向其第一个元素的指针。
第二个不行,因为您正在为指针分配一组字符。因为string
不是数组或结构,所以只使用初始化列表的第一个成员。所以你有一个字符常量,它有 type int
,你试图分配给一个指针。
你说如果你施放它会起作用。如果你是这个意思:
char *string = (char []){'H', 'e', 'l', 'l', 'o', '\0'};
那么你所拥有的实际上是右侧的复合文字,它具有数组类型,并且像第一个示例一样,数组衰减为指向其第一个成员的指针。
推荐阅读
- c# - c#中用protobuf-net序列化的对象可以通过生成.proto文件用python反序列化吗?
- feathersjs - Feathersjs,feathersjs-vuex clean npm install 给出问题
- python - scipy.linalg.inv 是否检查矩阵是否对角线?
- python-3.x - 不关闭的窗口
- c# - 如何从aspx c#网站读取客户端上的txt文件
- python - 直接导入子模块有什么好处(似乎更慢)?
- ray - 您可以为调度程序与一般调整试验使用不同的停止条件吗
- python - 我想编写一个函数,用列表中的其他值替换字符串的某些部分
- android - 如何显示实时运行的时间?
- elasticsearch - 如何正确设置日期和时间的映射以及如何在 ElasticSearch 中过滤它们?