指標,陣列與const
const char *, char const *, char *const, const char *const
const char *p;
char const *p;
這兩個定義是完全一樣的,而規範的寫法是 const char *p,都是指向靜態字元的指標。
P是可以改變的,但是*p不能改變的。即:pointer to const char.
char *const p;
說實在的我本以為這種定義是違法的,但是實質上這種定義是用來限定指標p是不能被改變的,而*p是可以改變的。即:const pointer to char.
const char *const p;
這是一級指標最嚴格的定義。指標p
理解這幾種定義和其含義並不難,但是需要區分一些不合法定義,就需要下一些工夫了。另外這裡所說的靜態,是指不能通過此指標改變。
比如: const char *p;
char A;
char B;
A=2;
B =3;
P = &A: //這個是合法的,此時 P指向地址的值為2
P = &B; //
B = 5; //這個是合法的,此時 P指向地址的值為5
*P = 6; //這個是不合法的
也就是說雖然這個定義說P指向地址的值不能改變,其實是不能通過P來改變,並沒有說不能通過其它方式改變。
總結:在一級const指標定義中,指標的值和指標指向地址存放的值,此兩個值的狀態是可以改變的。
帶有const二級指標四種合法定義:
const char **p; chat const **p; char *const *p; const char *const *p
const char **p;
char const **p;
兩者意義相同,指的是p,*p都是可以改變的,但是**p是不能被改變的。
char *const *p;
指的是p和**p可以給改變,但是*p是不能被改變的。
const char *const *p;
指的是p可以被改變,但是*p和**p都是不能被改變的。
總結:做了這麼多的實驗終於總結出了一條規律就是:在只有1個const的指標定義中,指標變數定義在程式中是不能被改變的。例如const char *p; *p是不能被二次賦值的;
char *const p; 則p是不能被二次賦值的。char const **p; 則**p是不能被重複賦值的。
如果還感覺到不好記憶話不防在看看以下三條規定:
1, 在定義指標是第一個字元不能為*;
2, 在基本資料型別不能被*直接修飾;
3, 定義時不是直接修飾變數的*,不能連續出現。
談到這裡還有一個問題沒有解決,就是如何使一個二級指標的指向具有靜態性呢?
我不知道,你知道能告訴我嗎?
下面討論一下指標的近親陣列和const的關係:
const char arry[2]; const char arry[2][4]; ……
char const arry[2]; char const arry[2][4]; ……
想必大家對這個比較熟悉,其含義是陣列中的內容是不能被改變的。不論是一維,二維還是更高的維數的陣列。即arry[],arry[][]等等是不能二次賦值的。
const char *arry[2];
與指標類似,這裡的*arry[0],*arry[1]不能二次賦值。(不要告訴我你不知道*arry[0]表示的是
什麼意思)
char *const arry[2];
這個定義沒有意義。因為arryp[]不能被賦值。
const char *const arry[2];
這個定義也沒有意義。