C++ 为什么char*c可以在没有分配或引用的情况下被分配字符串?
但是 需要像这样做C++ 为什么char*c可以在没有分配或引用的情况下被分配字符串?,c++,c,C++,C,但是 需要像这样做 int * p = 10; // throws an error 如果指针要分配给某个内存,或者它应该引用某个地址,那么为什么字符串可以存储在字符指针中而不向其分配内存,为什么不是整数数据类型?因为根据定义,字符串文本的类型为char*,指向字符串第一个字符的指针。指针变量应存储地址 int * p = new int(10); // in C++ int * p = (int*) malloc(1 * sizeof(*int)); // in C 因为,“world”在
int * p = 10; // throws an error
如果指针要分配给某个内存,或者它应该引用某个地址,那么为什么字符串可以存储在字符指针中而不向其分配内存,为什么不是整数数据类型?因为根据定义,字符串文本的类型为
char*
,指向字符串第一个字符的指针。指针变量应存储地址
int * p = new int(10); // in C++
int * p = (int*) malloc(1 * sizeof(*int)); // in C
因为,“world”
在程序的只读块中分配了内存,因此“world”
获得了一些地址,并且该地址存储在指针c
char * c = "world"; // works fine
因为10
是常量整数,并且尚未分配任何内存,因此它没有地址。我们不能在指针p
中存储常量10
,因为它不是地址
int * p = new int(10); // in C++
int * p = (int*) malloc(1 * sizeof(*int)); // in C
这就是为什么我们这样做
int * p = 10; // throws an error
将值为<代码> 10代码>内存的内存分配为整数,该地址的地址存储在
“world”
的类型为char[6]
(5表示字符串长度加1表示终止的“\0”
)。在C++中,它属于类型<代码> const char(6)< /代码>。这种差异是历史原因造成的;在任何一种语言中,字符串文字都应始终视为只读
和任何数组类型的表达式一样,在大多数上下文中,它隐式转换为指向其第一个元素的指针。这就是为什么
int * p = new int(10); // in C++
int * p = (int*) malloc(1 * sizeof(int)); // in C
这是有效的。字符串literal“world”
本身创建了一个数组对象,初始化使c
指向数组对象的第一个元素
在创建int
类型的对象时,没有这种内置语法
嗯,实际上有。C99添加了复合文字,允许您编写:
const char *c = "world";
它创建了一个类型为int[1]
的数组对象,并隐式转换为int*
。(C++没有此功能。)(数组对象的生存期取决于它出现的上下文;如果它在函数体中,当封闭块完成时,数组将停止存在。另一方面,字符串文字具有静态存储持续时间,并且在整个程序执行过程中都存在。)
顺便说一句,这是:
int *p = (int[]){ 10 };
是不正确的;您想要的是int*
,而不是*int
。但最好写为:
int * p = (int*) malloc(1 * sizeof(*int)); // in C
在C中不需要强制转换malloc的结果,在某些情况下可以隐藏错误。使用
sizeof*p
使代码更加健壮;如果以后将p
从int*
更改为(比如)双精度*,则只需在一个位置更改类型。“world”
是一个字符数组char*c
指向它的开头<代码> 10 < /Cord>只是一个整数。答案是,你和malloc
的示例并不等效,因为它没有将值设置为10
。在C99中,您可以编写`int*p=(int[1]){10};`这几乎直接等同于char*c=“world”
。它不应该是常量char*?@V-X字符串文字在C中具有类型char[]
;没有const
。但是,始终值得指出的是,当为字符指针分配字符串文字时,类型应该是const char*
,因为在大多数现代操作系统中,字符串文字位于只读内存段中(即使这不是真的,在运行时修改文字值似乎也有点不正常)。对不起,它应该是sizeof(int)。
int *p = malloc(sizeof *p));