C/C++中字符串常量为什么可以赋值给char*?

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*。

===》》》参考https://www.zhihu.com/question/20362192

猜你喜欢

转载自blog.csdn.net/J_H_C/article/details/84659085