楼主:
kdok123 (小天)
2014-10-19 23:33:09ex1:
char str[6] = "hello";
*str = 'x';
// 编译通过
ex2:
char *str = "hello";
*str = 'x';
//编译失败
想请问是为什么呢?
作者:
LPH66 (-6.2598534e+18f)
2014-10-19 23:41:00置底十三诫之四
ex1的str是阵列第一个元素的位址 会变成xelloex2的str是字符指标 字符指标重新指定字串要 str='x'字串会整个被改成x 而且应该要用双引号代表字串"x"
作者:
uranusjr (â†é€™äººæ˜¯è¶…級笨蛋)
2014-10-20 00:53:00不过原来这样会 error 啊, 我一直以为会通过然后 crash
作者:
johnpage (johnpage)
2014-10-20 00:58:00死背
作者:
LPH66 (-6.2598534e+18f)
2014-10-20 22:04:00连这都要死背的话还是别写程式吧 (望) 另外四楼后半不对它想做的跟 ex1 是一样的, 两者差别就只是五楼说的这样而已
如果要跟ex1一样只改字串中的单一字符是办不到的因为你的str是字符指标会指到一个字串他并没有像字符阵列有偏移的概念 所以不能拿str改字符所以*str跟*str[0]是一样意思 都是不行的~
作者:
LPH66 (-6.2598534e+18f)
2014-10-21 00:58:00唔嗯, C 语言的字串就只是个尾巴有个 '\0' 的字符阵列而已所以 ex2 之所以做不到的原因完全是因为唯读
喔喔 LPH66大大说的才是对的 系统会找个位址放字串常数 然后把位址回传给str 但这个位址系统不给用(唯独)
字符指标一样有偏移的概念,a[b]等同*(a+b)等同b[a]
只能重新让系统找新的位址放字串常数 回传字串常数的位址这样 受教了~~
所以*str等同str[0]跟0[str]第二个是因为str指向唯读区,*str相当于修改唯读区
楼主:
kdok123 (小天)
2014-10-22 10:58:00原来如此! 感谢各位解答!