const char* p 、char* const p、const (char*) p 理解记忆

来源:互联网 发布:投诉淘宝消协投诉电话 编辑:程序博客网 时间:2024/06/03 15:38


网上查找了很多理解记忆的方式,总结几个对自己理解很有帮助的原则:

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 <<" "<> wait;    return 0;}

const (char*) p:

网络有资料对其理解和 char* const p一样(char *作为一种新的类型);但是个人实验该种声明会直接报错“不允许使用该类型名”。


网上查找了很多理解记忆的方式,总结几个对自己理解很有帮助的原则:
阅读全文
0 0