0
char * c = "world"; // works fine 

int * p = 10; // throws an error

它需要像

int * p = new int(10); // in C++
int * p = (int*) malloc(1 * sizeof(*int)); // in C

如果指针要分配给某个内存或者它应该引用某个地址,那么为什么可以将字符串存储在字符指针中而不为其分配内存,为什么不是整数数据类型?

4

3 回答 3

3

C 和 C++ 碰巧提供了一种语法,即字符串文字,用于创建char具有指定初始值的数组类型的值。

在 C 中,字符串文字"world"是类型char[6](5 表示字符串的长度加上 1 表示终止'\0')。在 C++ 中,它的类型是const char[6]. 区别在于历史原因。在任何一种语言中,字符串文字都应始终被视为只读。

和任何数组类型的表达式一样,在大多数情况下,它被隐式转换为指向其第一个元素的指针。这就是为什么

const char *c = "world";

已验证。字符串文字"world"本身创建了一个匿名数组对象,并且初始化导致c指向数组对象的第一个元素。

碰巧没有这种用于创建类型对象的内置语法int

嗯,实际上是有的。C99 添加了复合文字,让您可以编写:

int *p = (int[]){ 10 };

它创建了一个类型为 的数组对象int[1],具有相同的隐式转换为int*. (C++ 没有复合文字。)(数组对象的生命周期取决于它出现的上下文;如果它在函数体内,则当封闭块完成时,数组将不复存在。字符串文字,另一方面手,具有静态存储持续时间并存在于程序的整个执行过程中。)

顺便说一句,这个:

int * p = (int*) malloc(1 * sizeof(*int)); // in C

是不正确的; 你想要int*,没有*int。但最好写成:

int *p = malloc(sizeof *p));

在 C中强制转换结果malloc是不必要的,并且在某些情况下可以隐藏错误。并且 usingsizeof *p使代码更加健壮;如果您稍后p从a 更改为int*a double*,则只需在一个地方更改类型。

于 2013-10-27T20:49:15.217 回答
1

因为根据定义,字符串字面量具有类型char*,即指向字符串第一个字符的指针。

于 2013-10-27T20:23:19.803 回答
1

指针变量应该存储地址。

char * c = "world"; // works fine

因为,"world"在程序的只读块中分配了内存,因此"world"得到了一些地址,这个地址存储在指针中c

int * p = 10; // throws an error

因为10是常量整数并且尚未分配任何内存,因此它没有地址。我们不能10在指针中存储常量,p因为它不是地址。

这就是为什么我们这样做

int * p = new int(10); // in C++

int * p = (int*) malloc(1 * sizeof(int)); // in C

这会将内存分配10给整数,并且该整数的地址存储在p正确的位置

于 2013-10-27T20:30:01.727 回答