0.指针常量&常量指针&指向常量的指针常量:傻傻分不清
- const int *p 或者 int const *p
- int * const p
- const int * const p
第一次看到上面的表达式,感觉很懵逼。如果您是属于完全不懵逼的人,那就可以跳过下面的部分了!
指针常量:本质是常量,但是指针修饰的,既然是常量,那常量的值是无法改变的。例如,小姐姐很漂亮,重点要表达的是漂亮的特性,漂亮不能改变
常量指针:本质是指针,但是用常量修饰的指针,说明这个指针不能改变。指针的本质是指向哪块内存,所以常量指针的精髓是,这个指针的指向不能改变。例如,漂亮的小姐姐,核心是小姐姐,小姐姐不能改变
1.指针常量
指针常量:
- p指针可变,即指针可以转向不同的变量
- p不可变,此时不能用p来修改变量
#include<iostream>
#include<string>
using namespace std;
int main()
{
int me = 20;
const int* p = &me;//p可变,即指针可以转向,*p不可变,此时不能用*p来修改变量
cout <<"me的值为:"<< me <<" me的地址为:" << &me << endl;
cout << "*p的值为:" << *p << " p的值为:" << p << endl;
int you = 50;
p = &you; // 改变了指针的指向
cout << "===========================" << endl;
cout << "you的值为:" << you << " you的地址为:" << &you << endl;
cout << "*p的值为:" << *p << " p的值为:" << p << endl;
//*p = 22; //*p不能在为变量重新赋值了,提示:表达式必须是可修改的左值
return 0;
}
me的值为:20 me的地址为:008FFA18
*p的值为:20 p的值为:008FFA18
===========================
you的值为:50 you的地址为:008FFA00
*p的值为:50 p的值为:008FFA00
- 如上中,const int* p = &me ,说明指针的值已经确定了,对应的是me的值,这是相当于是常量20,所以*p不能作为左值
- 有关左值的理解,可以浏览:https://blog.csdn.net/chenmozhe22/article/details/106123399
2.常量指针
常量指针:
- p指针不可变,即指针不可以转向其他的变量
- p可变,此时可以用p来修改变量的值
#include<iostream>
#include<string>
using namespace std;
int main() {
int me = 20;
int* const p = &me; //p2不可变,即不能改变指向的变量;但*p2可变,此时允许*p2来修改变量的值
cout <<"me的值为:"<< me <<" me的地址为:" << &me << endl;
cout << "*p的值为:" << *p << " p的值为:" << p << endl;
*p = 30;
cout << "===========================" << endl;
cout << "me的值为:" << me << " me的地址为:" << &me << endl;
cout << "*p的值为:" << *p << " p的值为:" << p << endl;
int you = 30;
// p = &you; // 错误提示:表达式必须是可改变的左值
}
me的值为:20 me的地址为:012FFD08
*p的值为:20 p的值为:012FFD08
===========================
me的值为:30 me的地址为:012FFD08
*p的值为:30 p的值为:012FFD08
3.指向常量的指针常量
指向常量的指针常量:
- p指针不可变,即指针不可以转向其他的变量
- p不可变,此时不可以用p来修改变量的值
int main() {
int me = 20;
const int* const p = &me; // p3不可变,即不能改变指向的变量;*p3也不可变,不能用*p3来修改变量的值
int you = 30;
p = &you; // 错误提示:表达式必须是可修改的左值
*p = 18; // 错误提示:表达式必须是可修改的左值
}
如完之后,还有哪里不清楚的,欢迎留言,我再补充下,争取所有人都看得懂!
指针的理解:https://blog.csdn.net/chenmozhe22/article/details/106099565
const的理解:https://blog.csdn.net/chenmozhe22/article/details/106123399