1、对于C来说,字符串常量是由字符构成的数组,比如“hello”类型为char[6],所以在C中可以直接字符串常量赋值给char*。既然C中字符串常量是是不是改变字符串常量的值呢?答案是否定的,虽然可以编译通过(会有警告),但是运行时会出错。因为字符串常量位于只读存储区不允许写操作。实验如下:
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
int main(int argc,char*argv[])
{
printf("running \n");
char *p = "hello";
printf("%s\n", p);
*p = "d";//改变p所指向的内存的值,即改变"hello",所以运行会出错
//p = "d";//只是改变了指针的指向,所以可以运行
printf("%s\n", p);
system("pause");
return 0;
}
在vscode中编译如下:
虽然出现了警告,但编译成功了。
运行结果如下:
程序在运行到*p = "d"时停止了。
2、但是对于C++来说,字符串常量是由常量字符构成的数组。比如"hello"类型是const char[6]。一般来说,const char *是不能转换成char *的,因为这样会删除底层const。但是这里为了兼容C代码做了特殊处理,所以允许将字符常量赋值给char*。