Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么char*c可以在没有分配或引用的情况下被分配字符串?_C++_C - Fatal编程技术网

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代码>内存的内存分配为整数,该地址的地址存储在P<代码>中,正确的

< P> C和C++提供了一个字符串字符串的语法,用于创建具有指定初始值的<代码> char < />代码类型数组的值。 在C语言中,字符串literal
“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>只是一个整数。答案是,你和 C> <代码>和 P<代码>完全不同,这就是为什么它们不同,但是首先, char *C=“Word”< /C> >在C++中是无效的,只在C中和过时的C++标准中,其次,您使用
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));