BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #72563同步于 2013/7/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

char * const

beer
2013/7/11镜像同步34 回复
char a[]="nice day"; char* const pc=a; //pc="hello world";//cannot change the pc pointer address a[0]='w'; cout<<pc<<endl;//"wice day" will be print } but I found segmentation fault will be caused if coding as char* const pc="hello hell"; //pc="hello world";//cannot change the pc pointer address *pc='w'; cout<<pc<<endl;//segmentation fault } 为什么 *pc='w'; 这样有问题呢
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
blackwc2006机器人#1 · 2013/7/11
编译器把普通字符串当作“array of n const char”。所以通过pc修改常量const char会出现segment fault。 char a[] = "nice day" 用普通字符串初始化一个数组,是给变量初始化,所以没有错误。 个人理解,如有错误求高人指正
Joevy机器人#2 · 2013/7/12
pc指向的地址是常量,那指向的地址在哪?你改成这样试试吧~~char a[] = "hello hell";char* const pc = a;*pc='w';
beer机器人#3 · 2013/7/12
这样肯定可以 问的是 char* const pc ="hello hell"; *pc='w'; 这样有什么问题呢 【 在 Joevy 的大作中提到: 】 : pc指向的地址是常量,那指向的地址在哪?你改成这样试试吧~~char a[] = "hello hell";char* const pc = a;*pc='w';
nxlhero机器人#4 · 2013/7/12
pc指向的地址在readonly section,不能写 【 在 beer 的大作中提到: 】 : 这样肯定可以 : 问的是 : char* const pc ="hello hell"; : ...................
lq5机器人#5 · 2013/7/12
【 在 beer 的大作中提到: 】 : 这样肯定可以 : 问的是 : char* const pc ="hello hell"; : ................... 因为你试图改变pc的地址值了。 原来的pc指向的是字符串“hello hell”在内存中的地址, 而在你试图将pc指向‘w’的时候就意味这你试图改变一个const修饰的地址常量的值了。 而没有出错的那种情况是因为 pc 指向的是一个char[],改变char[0]的内容,但是char数组的地址并不会改变。可以理解为pc是一个指向指针的指针。
kaka1992机器人#6 · 2013/7/12
每年都有学弟问一模一样的问题,要不要建议版主建立资料库呢?
lvjingyi123机器人#7 · 2013/7/12
我觉得是因为pc指向的是字符串常量 不能被修改啊~ 跟const无关 char* const pc只是说你的pc是一个常量类型的指针,不能修改这个指针的指向。也就是说这个const只是限定了你的这个指针*pc的指向是不能被修改的。 板凳里的能行是因为pc指向的是一个数组,数组内容可以改变。 你3楼里说的不行是因为pc指向的是字符串常量,不能被修改,你又试图修改。 欢迎指正 =、=
lvjingyi123机器人#8 · 2013/7/12
另外 要区分“指针常量”和“常量指针” char * const pc是指针常量,它限定了“不能修改这个指针的指向” const char *pc是常量指针,它限定了“不能通过指针来修改这个指针指向的值” 说完了 =、=
sa4ever机器人#9 · 2013/7/12
试图修改指针常量值为常量的变量 肯定是不行的,无论内容和地址都是写死了的