为什么C++中不能有非常数char*?

hc2pp10m  于 2022-12-05  发布在  其他
关注(0)|答案(4)|浏览(171)

为什么这样做:

char foo[6] = "shock";`

虽然这不起作用:

char* bar = "shock"; //error

为什么bar必须是const,而foo不是?C中的数组退化为指针,所以foobar在技术上不是具有相同的类型吗?

vhmi4jdf

vhmi4jdf1#

常值存放在内存的保留区域中,程式码不应该变更这些区域。变更存放常值的位址中的值,就意味着每次其他程式码尝试使用该常值时,都会在该内存中找到错误的值。因此,修改该内存是不合法的,因此将其视为非常数也是不合法的。
来源

2ledvvac

2ledvvac2#

有了这样的宣言:

char foo[6] = "shock";

变量foo是 * char数组 * 类型,它包含6个非常数字符。* 字符串文字 * 包含常量字符,这些字符在初始化时复制到数组中。
而与此同时宣言:

char* bar = "shock"; //error

变量bar是char* 的类型 * 指针。您试图使其指向"shock"的地址,该地址是包含const char的字符串文字。
不能将 * 指针指向 const char 处的非常数char*。
所以你必须这样做:

const char* bar = "shock";`
2q5ifsrm

2q5ifsrm3#

因为“shock”是一个常量,所以指向它的指针必须是const
由于历史原因,C允许这样做(并导致许多错误,导致SO发布)

9gm1akwq

9gm1akwq4#

char* bar = "shock";

大致相当于

const char anonymousArray[6] = "shock";
char *bar = anonymousArray;

数组衰变为指针,这和指针是不一样的。

相关问题