使用const与指针的问题#includeiostream#includecstdlibusing namespace stdvoid main(){const char
使用const与指针的问题
#include<iostream>
#include<cstdlib>
using namespace std;
void main(){
const char *p1="Hello";
cout<<"p1->"<<p1<<endl;
//p1[2]='a';
p1="Hello World";
cout<<"p1->"<<p1<<endl;
char * const p2="C++";
cout<<"p2->"<<p2<<endl;
p2[1]=p2[2]='p';
cout<<"p2->"<<p2<<endl;
//p2=p1;
const char *const p3="constpoint";
cout<<"p3->"<<p3<<endl;
//p3[3]='q';
//p3=p1;
system("pause");
}
------------------------------------
上面代码通过编译,但exe程序运行出错。为什么呢?
[解决办法]
[code=C/C++][/code]
char * const p2="C++"; //这里的char * const p2="C++"相当于const char * constp2="C++";
cout<<"p2->"<<p2<<endl;
p2[1]=p2[2]='p'; //所以这里就不对了
cout<<"p2->"<<p2<<endl;
//p2=p1;
因为字符窜"C++"存储在字符窜常量区,C++编译器会给你的char * const p2="C++"加上一个const
即为const char * constp2="C++";
[解决办法]
[解决办法]
你一个常量的地址赋给了指针,不能修改常量,如果你把常量赋值给一个变量,再把指针指向变量就ok了。
即:
char pp[4]="C++";
char *const p2=pp;
cout<<"p2->"<<p2<<endl;
p2[1]=p2[2]='p';
[解决办法]
楼主不用为const烦恼,你只要记住一句话就ok:const修饰谁,谁就不能改变。
char * const p2="C++";
cout<<"p2->"<<p2<<endl;
p2[1]=p2[2]='p';
分析:
1、const修饰指针p2,表示p2不能改变,即p2不能再指向其他的内存单元;
2、"C++"是常量字符串,存放在常量存储区,既然是常量存储区,自然也就是一直不变也不能变的地方。
综合1、2,p2不能改变,p2所指向的内容页不能改变。
[解决办法]
这种问题有个好几的办法,就是看const离哪个更近(从const 右边开始看),哪个就是const
const char* p1; const离*更近 知道就是*p1的值为const
const char* p1; 和char const *p1;两种写法一样 只是 char const调了个个
char * const p2; 从const右边开始看 看到了p2 ,p2为const ,*p2可修改
const char * const p3; 这个最好记了,就是*p3与p3都是const;
至于 char * const p2="C++" 的报错的原因是 "C++"是字符串常量,保存在代码段,代码段是只读的,不可以对指针指向的变量的值进行修改,
你可以试试 char* p="c++"; p[0]='a'; 可以看到虽然char* p没有任何const修饰,但是也会报错,原因就在于此。你如果想看看比较三者的区别,最好不要用字符串常量,因为这样相当于会自动对*加上const
可以定义一个char数字 char test[]="abcd";然后用是哪个指针分别指向test
p1=test;
p2=test;
p3=test;
