为什么我可以将char*值指定给字符串?

为什么我可以将char*值指定给字符串?,c,C,指针包含如上所述的地址值 但是为什么char不是这样工作的呢 char *y = "Hello World!"; char *x = &y; char *y = "Hello World!"; char *x = &y; 上面的代码可以工作,但为什么指针x能够存储字符串值而不是地址?字符*只是一个地址,实际上不是存储数据的空间。在存储字符串之前,必须使用malloc分配空间。不会在堆栈上创建Hello文本。它将存储在编译的对象文件或二进制文件的静态只读部分,char*x将只

指针包含如上所述的地址值

但是为什么char不是这样工作的呢

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

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

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

不会在堆栈上创建Hello文本。它将存储在编译的对象文件或二进制文件的静态只读部分,char*x将只是指向它的指针。它不会存储字符串。 这种赋值只能在C语言中实现,不过,我相信,因为它的类型检查很弱。 在C++中,只能对conchchar变量赋值。< /P> 这:

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

如果您想要字符串文本的可写版本,将字符串文本压缩到malloced内存也可以

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

char x[] = "Hello"; 
将实际在gcc中编译,但带有警告。字符串文字将自动转换为char*指针,该指针将自动转换为整数,而该指针将严重自动转换为char,但这完全不是您想要的

&y是字符**指向字符的指针,而不是字符*指向字符的指针。不能将字符**分配给字符*,反之亦然。他们指向两个不同的东西

但是为什么char不是这样工作的呢

char *y = "Hello World!";
char *x = &y;
char *y = "Hello World!";
char *x = &y;
Hello是一个字符串文本。它作为静态只读内存中的char[]数组实现。数组可以衰减为相同基类型的指针。然而,请注意,在这个例子中,在一个非conchar *指针中分配字符串文字是在C++的现代版本中被禁止的。旧版本允许它与C.在现代C++版本中的向后兼容性,需要使用conchar *指针来代替:

char *x = "Hello";
否则,您可以将文本复制到非常量char[]数组中,并将其衰减为非常量char*指针:


观察:你的用户名不是一个让人想帮助你的用户名。你最初的字符示例不起作用;chary=你好,世界!;是分配给char的主要类型不匹配指针。如果有char y='H';,您可以使用char*x=&y;-这是合法的,尽管y不指向字符串;它只指向一个字符。字符串是带有空终止符的字符数组。我以前认为堆栈溢出是针对大脑受损的人的。然后我的大脑真的受伤了,我完全相信这是非常棒的。真实故事DA char*x只能存储单个字符的地址。但是,函数在内存中访问该字符及其后的字符,直到找到\0个字符为止。换句话说,只需指向字符串的起始字符,函数就知道如何查找其余字符。不过,说真的,这样做很有用。大多数问题可能都很琐碎,甚至很愚蠢,但这是一个相当好的同行评审代码片段和解决方案的语料库,如果我不只是为了好玩而回答,我认为这有助于构建它。但我完全明白为什么有人会这么讨厌DSo当使用char*时,它应该是const,这样我就不会丢失字符串Hello?它应该是const,因为如果不是,编译器不会警告您不要写入它所指向的内容。如果你确实写下了它的含义,操作系统通常会因为一个Sebug而杀死你,因为你将被写入到标记为只读的内存中。请注意,旧的C++版本允许将字符串文字分配给非conchar *指针,与C的向后兼容性,它只是现代C++版本C++ 11和以后的版本,它不允许这个任务,而是使用conchchar *指针。
char *x = "Hello";
const char *y = "Hello World!";
const char *x = y;
char y[] = "Hello World!";
char *x = y;