int y = 5;
int *x = &y;
指针保存上面的地址值......
char *y = "Hello World!";
char *x = &y;
但是char怎么没有那样工作呢?
char *x = "Hello";
上面的代码可以工作,但是指针x如何能够存储字符串的值而不是地址?
答案 0 :(得分:1)
char *y = "Hello World!"; char *x = &y;
&y
是char**
(指向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,但它完全不是您想要的。