为什么我能够将char *值分配给字符串?

时间:2015-08-11 00:10:35

标签: c

int y = 5;
int *x = &y;

指针保存上面的地址值......

char *y = "Hello World!";
char *x = &y;

但是char怎么没有那样工作呢?

char *x = "Hello";

上面的代码可以工作,但是指针x如何能够存储字符串的值而不是地址?

3 个答案:

答案 0 :(得分:1)

char *y = "Hello World!";
char *x = &y;

&ychar**(指向char指针的指针),而不是char*(指向char的指针)。您无法将char**分配给char*,反之亦然。他们指出了两件不同的事情。

  

但是为什么char不会那样工作?

char *x = "Hello";

"Hello"字符串文字。它在静态(只读)内存中实现为char[]数组。数组可以衰减成相同基类型的指针。但请注意,在此示例中,在现代版本的C ++中,将字符串文字指定给非const char*指针已弃用。较旧的版本允许它向后兼容C.在现代C ++版本中,您需要使用 const char*指针代替:

const char *y = "Hello World!";
const char *x = y;

否则,您可以将文字的副本复制到非const char[]数组中并将其衰减为非常数 {{1} }指针:

char*

答案 1 :(得分:0)

char *只是一个地址,实际上并不是存储数据的空间。在存储字符串之前,必须使用malloc分配空间。

答案 2 :(得分:0)

不会在堆栈上创建"Hello"字面值。它将存储在编译对象文件或二进制文件的静态只读部分中,char *x将只是指向它的指针。它不会存储字符串。 但是,我认为,这种分配只能在C中实现,因为它的类型检查很弱。 在C ++中,您只能对const char*变量进行分配。

此:

char x[] = "Hello"; 

实际上将字符串存储在堆栈中的char数组中,并且数组不需要const

如果你想要一个字符串文字的可写版本,那么

{{1}将字符串文字放入strcpy内存中也可以。

无论如何,这个错误的代码:

malloc

实际上会在char y = "Hello World!"; char *x = &y; 中编译,但会发出警告。字符串文字将自动转换为gcc指针,该指针自动转换为整数,该整数自动转换(严重)为char,但它完全不是您想要的。