读书人

关于常量指针和指针常量的有关问题

发布时间: 2013-10-17 17:26:17 作者: rapoo

关于常量指针和指针常量的问题
1.指针常量改变指向的值。
int main() {
char *str1={"Hello"};
char *str2={"Hello World"};
char * const ptr1 =str1 ;
cout<<ptr1<<endl;
*ptr1='A';
printf("%c \n",*ptr1);
cout<<ptr1<<endl;
return 0;
}

以上程序,编译可以通过。但是运行时候会出现问题。
First-chance exception at 0x0033150f in test1.exe: 0xC0000005: Access violation writing location 0x00337818.
Unhandled exception at 0x0033150f in test1.exe: 0xC0000005: Access violation writing location 0x00337818.

那么,请问如何改变指针常量所指向的值?


2.如何更新常量指针的值。
int main() {
char *str1={"Hello"};
char *str2={"Hello World"};
const char *ptr1 =str1 ;
cout<<ptr1<<endl;
str1="no longer hello";
cout<<ptr1<<endl;
return 0;
}

输出是:
Hello
Hello
为什么会这样子? 指针常量?常量指针?改值
[解决办法]
1 *ptr1 = 'A'; //错了,修改了静态区(可读)的内容
通过修改ptr1的指向的地址!而不能在原来的地址基础上修改它的内容!

2 首先是str1指向"Hello"这个常量区首地址,然后通过复制地址操作
ptr1也指向了"Hello"这个常量区的首地址,然后又把"no longer hello"的首地址的值赋值给str1
ptr1还是指向"Hello"的首地址,所以结果是这样的!
[解决办法]
你理解错了,首先你打印的是str1本身的地址而又不是它指向的地址,它本身指针的地址没有变化,
只是它指向的地址改变了而已


cout<<(void *)str1<<endl;
//请在你改变str1的两处加上这个,打印它指向的地址,肯定是发生变化了的!

读书人网 >C++

热点推荐