user-0 提问: char *str="abcdefg";  这条 语句这样写合法吗？

回复:
user: user-1
content: 看了一下这个帖子,我觉得ryxcaixia开头本来就说错了呀,有啥好吵得,这是被人指出错误然后恼羞成怒了?

user: user-2
content: 任何常量区都是伪常量区！

user: user-3
content: 合法，就是指针str指向“abcdefg”这个常量区

user: user-4
content: 理论上是合法的，但是你这样写之后就不能用str来修改这个字符串了，因为对于这种形式的语句来说这个是一个const char

user: user-5
content: 引用 7 楼 u014444402 的回复:[quote=引用 6 楼 ryxcaixia 的回复:] 只在第一次合法 如char* p = NULL; p = "abcde" 这种自然报错  char* p = "abcde" 这种可以让一个非常量指针直接指向常量, 是因为字符串常量的地址是在编译期就确定的 存在于程序的静态常量区 符号表中  一个编译期间确定好的地址 自然可以在初始化的时候赋值给一个非常量指针 你错了, char* p = NULL; p = "abcde"; 这样是没有问题的.不会"自然报错"的.一个指针变量赋给他一个地址能有什么错.[/quote] 不要纠结编译器会不会报错，至少这样写本身是错误的。就跟：char *p = "Hello world!";应该写成：const char *p = "Hello world!";char *p; p = "Hello world!";应该写成：const char *p; p = "Hello world!"; 一样的。虽然编译器不一定报错，但毕竟不是可写的，就不要这样写，防止程序崩溃。

user: user-6
content: 《深入理解C指针》这本书不错，也比较薄，有大量的图解，指针不再难。

user: user-7
content: 引用 16 楼 zhao4zhong1 的回复:#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！   求再贴一下 3q 赵4老师

user: user-7
content: 引用 16 楼 zhao4zhong1 的回复:#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！   赵4老师 我记得你有一段话 经常会贴出来 但是找不到了 就是那句 不迷信教科书 课本  要新密反汇编 cpu 这是一段  还一段是关于IDE 大概意思是一个IDE如果能精准的反汇编每一句源代码 那这个IDE是可以用的 并且是好用的

user: user-7
content: 引用 17 楼 wen_eric 的回复:[quote=引用 11 楼 ryxcaixia 的回复:] [quote=引用 10 楼 wen_eric 的回复:] [quote=引用 6 楼 ryxcaixia 的回复:] 只在第一次合法 如char* p = NULL; p = "abcde" 这种自然报错  char* p = "abcde" 这种可以让一个非常量指针直接指向常量, 是因为字符串常量的地址是在编译期就确定的 存在于程序的静态常量区 符号表中  一个编译期间确定好的地址 自然可以在初始化的时候赋值给一个非常量指针  如char* p = NULL; p = "abcde"； 这样不会报错。[/quote]  XB[/quote]错了就好好反省，下次不要不负责任的误导别人。[/quote]  本来呢 不想骂人 但是你自己还找骂 那在下不客气了 请允许我优雅真诚的对你说一句 我去年买了个登山包 超耐磨 超耐磨

user: user-8
content: 完全可以这样写...

user: user-8
content: 完全可以这写，标准中没有任何约束不允许这样写。 char *str="abcdefg"; 这里str不是常量指针（不管这个词指啥，constant pointer还是pointer to const-qualified），"abcdefg"也不是常量字符串。

user: user-9
content: 引用 11 楼 ryxcaixia 的回复:[quote=引用 10 楼 wen_eric 的回复:] [quote=引用 6 楼 ryxcaixia 的回复:] 只在第一次合法 如char* p = NULL; p = "abcde" 这种自然报错  char* p = "abcde" 这种可以让一个非常量指针直接指向常量, 是因为字符串常量的地址是在编译期就确定的 存在于程序的静态常量区 符号表中  一个编译期间确定好的地址 自然可以在初始化的时候赋值给一个非常量指针  如char* p = NULL; p = "abcde"； 这样不会报错。[/quote]  XB[/quote]错了就好好反省，下次不要不负责任的误导别人。

user: user-2
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-10
content: C++ 不允许这样写。  但是 C 允许。  为了兼容性考虑，现在有很多 C++ 编译器支持这种写法（其中有一些虽然支持，但是会给一个 warning）。

user: user-11
content: 按理要写成const char* 不过允许写成char* 算是一个特例吧，历史遗留原因

user: user-7
content: 引用 12 楼 u014444402 的回复:[quote=引用 11 楼 ryxcaixia 的回复:] [quote=引用 10 楼 wen_eric 的回复:] [quote=引用 6 楼 ryxcaixia 的回复:] 只在第一次合法 如char* p = NULL; p = "abcde" 这种自然报错  char* p = "abcde" 这种可以让一个非常量指针直接指向常量, 是因为字符串常量的地址是在编译期就确定的 存在于程序的静态常量区 符号表中  一个编译期间确定好的地址 自然可以在初始化的时候赋值给一个非常量指针  如char* p = NULL; p = "abcde"； 这样不会报错。[/quote]  XB[/quote] 讨论就讨论,骂人就不对了. 首先,在PC平台,常量指针与内存指针位数是一样的,不会有错,可能一些嵌入平台会有错,例如 picc编译器 "ddddd"这个指针是24位的,普通的指针才是16位的,所以会有错.[/quote]  为啥要生气呢 亲? 上述所有说的指针无非都是基于vs 编译器和gcc/g++编译器 例如masm5.0 16位汇编 那他的指针又是多少位? 估计他还没指针的概念  有问题大家拿出来讨论下 对就是对 错就是错 我把代码拿到编译器去试了下 得出之前我的结论是错的 提高不就是在互相交流(更多时候是喷)中产生的么 你说我说的对吧亲

user: user-12
content: 引用 11 楼 ryxcaixia 的回复:[quote=引用 10 楼 wen_eric 的回复:] [quote=引用 6 楼 ryxcaixia 的回复:] 只在第一次合法 如char* p = NULL; p = "abcde" 这种自然报错  char* p = "abcde" 这种可以让一个非常量指针直接指向常量, 是因为字符串常量的地址是在编译期就确定的 存在于程序的静态常量区 符号表中  一个编译期间确定好的地址 自然可以在初始化的时候赋值给一个非常量指针  如char* p = NULL; p = "abcde"； 这样不会报错。[/quote]  XB[/quote] 讨论就讨论,骂人就不对了. 首先,在PC平台,常量指针与内存指针位数是一样的,不会有错,可能一些嵌入平台会有错,例如 picc编译器 "ddddd"这个指针是24位的,普通的指针才是16位的,所以会有错.

user: user-7
content: 引用 10 楼 wen_eric 的回复:[quote=引用 6 楼 ryxcaixia 的回复:] 只在第一次合法 如char* p = NULL; p = "abcde" 这种自然报错  char* p = "abcde" 这种可以让一个非常量指针直接指向常量, 是因为字符串常量的地址是在编译期就确定的 存在于程序的静态常量区 符号表中  一个编译期间确定好的地址 自然可以在初始化的时候赋值给一个非常量指针  如char* p = NULL; p = "abcde"； 这样不会报错。[/quote]  XB

user: user-9
content: 引用 6 楼 ryxcaixia 的回复:只在第一次合法 如char* p = NULL; p = "abcde" 这种自然报错  char* p = "abcde" 这种可以让一个非常量指针直接指向常量, 是因为字符串常量的地址是在编译期就确定的 存在于程序的静态常量区 符号表中  一个编译期间确定好的地址 自然可以在初始化的时候赋值给一个非常量指针  如char* p = NULL; p = "abcde"； 这样不会报错。

user: user-7
content: 引用 7 楼 u014444402 的回复:[quote=引用 6 楼 ryxcaixia 的回复:] 只在第一次合法 如char* p = NULL; p = "abcde" 这种自然报错  char* p = "abcde" 这种可以让一个非常量指针直接指向常量, 是因为字符串常量的地址是在编译期就确定的 存在于程序的静态常量区 符号表中  一个编译期间确定好的地址 自然可以在初始化的时候赋值给一个非常量指针 你错了, char* p = NULL; p = "abcde"; 这样是没有问题的.不会"自然报错"的.一个指针变量赋给他一个地址能有什么错.[/quote]  还有 你也错了 "个指针变量赋给他一个地址能有什么错" 你让一个常量指针指向这个字符串地址 再让一个普通指针指向这个常量指针 自然报错