看到这个标题是不是晕菜~~~
指针常量、常量指针、常指针常量不是一个东西吗?
错了,还真不是。
不急,不慌,听小编慢慢道来。。。
你听说过指针数组和数组指针吗?其实你可以把指针数组理解为int数组,int数组是什么,就是用户定义了一个int数组,这个数组里面存的所有元素都是int类型(e.g.:int serven[5] = {1,2,3,4,5}),所以类比指针数组就可以很明确的知道数组里面存放的元素都是指针(e.g.:int* serven[5] = {*a,*b,*c,*d,*e})。而数组指针是指这个数组是指针,该指针指向了数组。
上图可以看到指针*p存放的是数组serven的首地址0x0000,所以访问该数组也可以通过指针区访问。这也叫做数组指针。
说了这么多,你也知道我要类比什么啦~~~。
常量指针
既然数组指针是指一个指针指向一个数组,那么常量指针就是一个指针指向一个常量,并且这个指针是可以改变的,指针可以改变指向的常量/变量,指针指向的变量是可以修改的,但是只限于变量本身去修改,不能够通过指针的形式来修改该值,例如:
当常量指针指向serven_1的时候,此时的serven_1的数值为5,可以只通过serven_1 = 6的方式直接修改serven_1的值,但是唯独不能用*p = 6去修改serven_的数值,切记。但是可以将指针去指向别的变量/常量。代码示例如下:
// 常量指针:定义一个常量指针后,指针指向的值就不能被改变,即不能通过指针变量直接更改指针指向的值
void Test_ConstPointer(){
int serven_1 = 5; // 定义一个变量为5
int serven_2 = 3; // 定义一个变量为3
const int* p; // 定义一个常量指针
p = &serven_1;
cout<<"指针常量所指向的地址为:"<<p<<",存储的数值为:"<<*p<<endl;
serven_1 = 6;
cout<<"改变serven_1的值后指针常量所指向的地址为:"<<p<<",存储的数值为:"<<*p<<endl;
p = &serven_2; // 允许指向别的变量或者/常量
cout<<"改变p的指向后指针常量所指向的地址为:"<<p<<",存储的数值为:"<<*p<<endl<<endl;
//*p = 7; // 不能给常量指针赋值
}
运行结果:
指针常量
指针常量是指指针本身所指向的常量/变量的地址值不能改变,但是可以通过*p去改变变量的值,
当指针常量指向serven_1的时候,此时的serven_1的数值为5,可以只通过serven_1 = 6的方式直接修改serven_1的值,也可以通过*p = 6去修改serven_1的数值,但是不能拿指针指向别的变量/常量,切记。指针常量已定义就得给它初始值。代码示例如下:
// 指针常量:指针变量不允许修改,既然指针变量的值不能修改
void Test_PointerConst(){
int serven_1 = 5; // 定义一个变量为5
int serven_2 = 3; // 定义一个变量为3
int* const p=&serven_1; // 定义一个指针常量*p指向serven_1的地址,就相当于指针存放了serven_1的地址,不能改变了,一定要在这里进行初始化,明确指针的指向
cout<<"指针常量所指向的地址为:"<<p<<",存储的数值为:"<<*p<<endl;
serven_1 = 6;
cout<<"改变serven_1的值后指针常量所指向的地址为:"<<p<<",存储的数值为:"<<*p<<endl;
*p = 6; // 允许通过*p修改指向的变量的数值
cout<<"改变*p的值后指针常量所指向的地址为:"<<p<<",存储的数值为:"<<*p<<endl<<endl;
//p = &serven_2; // 指针指向另外一个变量,就是指针存放别的变量的地址是不允许的
}
运行结果:
常量指针常量
常量指针常量就融合了指针常量和常量指针的特性,即指针不能指向别的变量/常量,并且不能通过指针去修改变量的数值。
代码如下:
// 常指针常量:指针本身不能改变,指针指向的值也不能改变
void Test_ConstPointerConst(){
int serven_1 = 5; // 定义一个变量为5
int serven_2 = 3; // 定义一个变量为3
const int* const p = &serven_1;
cout<<"指针常量所指向的地址为:"<<p<<",存储的数值为:"<<*p<<endl;
serven_1 = 6;
cout<<"改变serven_1的值后指针常量所指向的地址为:"<<p<<",存储的数值为:"<<*p<<endl;
//p = &serven_2; // 不允许
//*p = 4; // 不允许
}
运行结果:
这里再补充一下:
引用和指针
引用是C++独特于C语言的操作,他就是为变量另起了一个名称,很多资料说引用不占有内存,但是其实引用就是一个指针常量,如下代码所示:
int serven = 1; // 定义一个变量serven
int &serven_quote = serven; // 定义一个引用serven_quote引用变量serven
serven_quote = 2; // 修改引用变量的值
这里的 int &serven_quote = serven 转化为 int* const serven_quote = serven,而serven_quote = 2转化为*serven_quote = 2;说白了就是将servne_quote转化为*serven_quote的过程,即 “自动解引用”。
那么还有就是一个const引用,也就是:
const int& serven_quote = serven;
其实相当于:
const int* const serven_quote = serven;
总结一下:
-
指针常量是指,指针指向了一个常量/变量,然后指向的地址是不能改变的,从始至终只指向同一个内存区域(自始至终指向心爱的人),所以他能够通过至真本身修改变量的数值(因为专一,所以他可以通过自身去影响他人);
-
常量指针就不一样了,他指向一个常量/变量,然后它还可以指向别的变量和常量,真的是花天酒地的渣指针,所以导致它不能够通过自己去改变变量(因为渣,所以不能以身作则去改变别人,从而影响别人);
-
常量指针常量就是专一的不行了,简直是神的存在。
好了,这就是三者的区别了~~~
你,看懂了吗?
看不懂,那说明你还不够渣?
不懂的话关注公众号 “三贝勒文子” 给小编留言哦~~~