网上查找了很多理解记忆的方式,总结几个对自己理解很有帮助的原则:
1:从右至左理解(应该和c++的语言特性有关)
2:const修饰最近的一个单词,‘*’除外。(还有一种理解const在‘*’左,修饰指针指向内容,在‘*’右,const修饰指针)
3:‘*’的理解(个人,不对再改):‘*’首先是一种描述,描述‘*’作用的变量,它的值是一个地址;然后‘*’有一个动作,将之后的修饰(即‘*’左的修饰)转为描述上述地址所指向的空间。
const char* p:
从右至左:
p是一个变量;
‘*’:①p中记录的是一个地址A②后面的修饰都在修饰这个地址A;
char :地址A存储的是char类型
const:就近修饰 char,地址A存储的是不能改变的char。
改变的理解:地址A的值就是一个char值,且不能改变;指向改地址的p可以再次指向另一个char类型的地址
即可以出现“ p = ……”,但不能出现 “ *p = ……”
补充:指针p指向的值可以是char类型,也可以是const char类型;
const限定的是不能通过“*p = ”去改变这个地址的值,无论这个地址是char还是const char类型;
而若指针p本身指向的或是再次赋值指向的是一个char类型,则这个地址的值可通过其他获取方式赋值改变,而‘*p’获取到的值也会随之改变;
具体的实验代码
#include
#include
using namespace std;
int main()
{
int wait;
const char i = 'x';
char j = 'l';
const char * p1 = &i; //可以改变地址,但不能通过 *p1= 改变的i值
cout << *p1 << endl; // *p1 : x
//*p1= 'a' //错误,不能通过 *p1= 去改变值
p1 = &j;//正确,可以改变指向地址,新指向的是 char,而非 const char;
cout << *p1 << endl; // *p1 : l
//*p1= 'a' //错误,虽然j是char类型,但是const修饰,仍不能通过 *p1 去改变值
j = 'a';//正确,j并不是const
cout << *p1 << endl; // *p1 : a *p1随之改变
cin >> wait;
return 0;
}
char* const p:
从右至左:
p是一个变量;
const:就近修饰p,p中的值不能改变;
‘*’:①p中不能改变的值是一个地址A②后面的修饰都在修饰这个地址A;
char:地址A中存储char类型值。
改变的理解:p变量的地址值不能改变,指针p只能指向这个地址,这个地址存储的值是可以改变的
即不能出现“p = ……”,但可以出现“*p = ……”
补充:指针p只能指向char类型,不能指向const char类型;
const限定的是p的值不能变,即其指向地址不能变
#include
#include
using namespace std;
int main()
{
int wait;
char i = 'x';
char j = 'l';
char* const p2 = &i; //不可以改变地址,但可以通过 *p1= 改变i的值
cout << *p2 << endl; // *p1 : x
*p2 = 'a'; //正确,能通过 *p1= 去改变值
cout << *p2 <<" "<
<< endl; // *p1 : a i = a
//p2 = &j;//错误,不能改变p2值
cin >> wait;
return 0;
}
const (char*) p:
网络有资料对其理解和 char* const p一样(char *作为一种新的类型);但是个人实验该种声明会直接报错“不允许使用该类型名”。