为什么这样做:
char foo[6] = "shock";`
虽然这不起作用:
char* bar = "shock"; //error
为什么bar必须是const,而foo不是?C中的数组退化为指针,所以foo和bar在技术上不是具有相同的类型吗?
bar
const
foo
vhmi4jdf1#
常值存放在内存的保留区域中,程式码不应该变更这些区域。变更存放常值的位址中的值,就意味着每次其他程式码尝试使用该常值时,都会在该内存中找到错误的值。因此,修改该内存是不合法的,因此将其视为非常数也是不合法的。来源
2ledvvac2#
有了这样的宣言:
char foo[6] = "shock";
变量foo是 * char数组 * 类型,它包含6个非常数字符。* 字符串文字 * 包含常量字符,这些字符在初始化时复制到数组中。而与此同时宣言:
变量bar是char* 的类型 * 指针。您试图使其指向"shock"的地址,该地址是包含const char的字符串文字。不能将 * 指针指向 const char 处的非常数char*。所以你必须这样做:
"shock"
const char
const char* bar = "shock";`
2q5ifsrm3#
因为“shock”是一个常量,所以指向它的指针必须是const由于历史原因,C允许这样做(并导致许多错误,导致SO发布)
9gm1akwq4#
char* bar = "shock";
大致相当于
const char anonymousArray[6] = "shock"; char *bar = anonymousArray;
数组衰变为指针,这和指针是不一样的。
4条答案
按热度按时间vhmi4jdf1#
常值存放在内存的保留区域中,程式码不应该变更这些区域。变更存放常值的位址中的值,就意味着每次其他程式码尝试使用该常值时,都会在该内存中找到错误的值。因此,修改该内存是不合法的,因此将其视为非常数也是不合法的。
来源
2ledvvac2#
有了这样的宣言:
变量
foo
是 * char数组 * 类型,它包含6个非常数字符。* 字符串文字 * 包含常量字符,这些字符在初始化时复制到数组中。而与此同时宣言:
变量
bar
是char* 的类型 * 指针。您试图使其指向"shock"
的地址,该地址是包含const char
的字符串文字。不能将 * 指针指向 const char 处的非常数char*。
所以你必须这样做:
2q5ifsrm3#
因为“shock”是一个常量,所以指向它的指针必须是const
由于历史原因,C允许这样做(并导致许多错误,导致SO发布)
9gm1akwq4#
大致相当于
数组衰变为指针,这和指针是不一样的。