1. 程式人生 > >指標,陣列與const

指標,陣列與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

不能改變,而且*p也不能改變。即:const pointer to const char.

理解這幾種定義和其含義並不難,但是需要區分一些不合法定義,就需要下一些工夫了。另外這裡所說的靜態,是指不能通過此指標改變。

比如: const char *p;

              char        A;

              char       B;

              A=2;

              B =3

              P = &A:   //這個是合法的,此時 P指向地址的值為2

              P = &B;   //

這個是合法的,此時 P指向地址的值為3

              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都是不能被改變的。

總結:做了這麼多的實驗終於總結出了一條規律就是:在只有1const的指標定義中,指標變數定義在程式中是不能被改變的。例如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];

這個定義也沒有意義。