const char* p 、char* const p、const (char*) p 理解记忆
網上查找了很多理解記憶的方式,總結幾個對自己理解很有幫助的原則:
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并不是constcout << *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 *作為一種新的類型);但是個人實驗該種聲明會直接報錯“不允許使用該類型名”。
網上查找了很多理解記憶的方式,總結幾個對自己理解很有幫助的原則:
總結
以上是生活随笔為你收集整理的const char* p 、char* const p、const (char*) p 理解记忆的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CGAL window 10安装、Dem
- 下一篇: NeHe OpenGL课程 网址整理