關於const限定的字元指標

2021-05-27 17:58:07 字數 3455 閱讀 2756

(1) const char *p

(2) char const *p

(3) char * const *p

(4) const char **p

(5) char const **p

(6) char * const  *p

(7) char ** const p

當然還有在(5)、(6)、(7)中再插入乙個const的情況,不過分析了以上7種,其它的就可類推了!

1. 關鍵看const修飾誰

2. 由於沒有const *的運算,若出現const *的形式,則const實際上是修飾前面的

比如:char const *p, 由於沒有const *運算,則const實際上是修飾前面的char, 因此char const *p 等價於const char *p,也就是說上面7種情況種,(1)和(2)等價。同理,(4)和(5)等價。在(6)中,由於沒有const*運算,const實際上修飾的是前面的char *,但不能在定義時轉換寫成const (char *) *p,因為定義在「()」中是表示函式。

0. 程式在執行是為其開闢的空間皆在記憶體(ram)中,而ram裡的記憶體單元是可讀可寫的;指標只是用來指定或定位要操作的資料的工具,用來讀寫ram裡記憶體單元的工作指標。若對指標不加任何限制,程式中乙個指標可以指向ram中的任意位置(出了系統敏感區,如作業系統核心所在區域)並對其指向的記憶體單元進行讀和寫操作(由ram的可讀可寫屬性決定);ram裡記憶體單元的可讀可寫屬性不會因為對工作指標的限定而變化(見下面的第4點),而所有對指標的各種const限定說白了只是對該指標的讀寫許可權(包括讀寫位置)進行了限定。

1. char *p: p是乙個工作指標,可以用來對任意位置(非系統敏感區域)進行讀操作和寫操作,一次讀寫乙個位元組(char佔乙個位元組儲存單元)。

2. const char *p 或者 char const *p(因為沒有const char *p運算,因此const修飾的還是前面的char):可以對任意位置(非系統敏感區域)進行「唯讀」操作。

3. char *const p (const修飾的是p):這能對「某個固定位置」進行讀寫操作,並且在定義p時就必須初始化(因為在後面不能執行「p=... 「 的操作,因此就不能在後面初始化,因此這能在定義是初始化)。 (」某個固定的位置「是相對於char *p來說所限定的內容)

可以總結以上3點為:char *p中的指標p通常是」萬能「的工作指標,而(2)和(3)只是在(1)的基礎上加了些特定的限制,這些限制在程式中並不是必須的,只是為了防止程式設計師的粗心大意而產生事與願違的錯誤。

另外,要明白」每塊記憶體空間都可有名字;每塊記憶體空間內容皆可變(除非有所限制)「。比如函式裡定義的char s = "hello",事實上在程序的棧記憶體裡開闢了6個變數共六個位元組的空間,其中6個字元變數的名字分別為:s[0]、s[1]、s[2]、s[3]、s[4]、s[5]、s[6] (內容是'\0')。

4. 上面的(2) 和(3)只是對p進行限定,沒有也不能對p所指向的空間進行限定,對於"char s = "hello"; const char *p = s; " 雖然不能通過 *(p+1) = 'x' 或者

p[i] = 'x' 來修改陣列元素 s[0] ~ s[4] 的值,但可以通過 *(s+1) = 'x' 或者 s[i] = 'x' 來修改原陣列元素的值——ram裡記憶體單元的可讀可寫屬性不因對工作指標的限定而改變,而只會因對其本身的限定而改變。如const char c = 『a』, c是ram裡乙個記憶體單元(8位元組)的名字,該記憶體單元的內容只可讀,不可寫。

5. const char **p 或者 char const **p: 涉及兩個指標p 和 *p。 由於const 修飾char, 對指標p 沒有任何限定,對指標*p 進行了上面情況(2)的限定。

6. char * const *p: 涉及兩個指標p 和 *p。 由於const修飾前面的char *, 也就是對p所指向的內容*p進行了限定(也屬於前面的情況(2))。 而對*p來說,由於不能通過 " **p = ... " 來進行另外賦值,因此屬於前面的情況(3)的限定。

7. char ** const p: 涉及兩個指標p 和 *p, const 修飾p, 對p進行上面情況(3)的限定,而對*p沒有任何限制。

1. 問題

char *p1; const *p2 = p1;  //合法

char **p1; const char **p2 = p2; // 不合法,會有警告warning: initialization from incompatible pointer type

char **p1; char const **p2 = p1; // 不合法,會有警告warning: initialization form incompatible pointer type

char **p1; char * const *p2 = p1; //合法

2. 判斷規則

明確const修飾的物件! 對於指標p1 和 p2,若要使得 p2 = p1 成立,則可讀做

p1是指向x型別的指標,p2是指向「帶有const限定」的x型別的指標「。

char *p1; const *p2 = p1; // 合法:p1是指向(char)型別的指標,p2是指向」帶有const限定「的(char)型別的指標。

char **p1; const char **p2 = p1; //不合法:p1是指向(char*)型別的指標,p2是指向((const char) *)型別的指標。

char **p1; char const **p2 = p1; // 不合法:與上等價。

char **p1; char * const *p2 = p1; //合法:p1是指向(char *)型別的指標,p2是指向」帶有const限定「的(char *)型別的指標。

1. 含有const 的單層或雙層指標的統一讀法:

p是乙個指標,是乙個[「帶有const限定」的] 指向 [「帶有const限定」的] x型別的指標「。

2. 定義時const修飾的物件是確定的,但不能再定義時加括號,不然就和定義時用」( )「表示的函式型別想混淆了!因此定時時不能寫 (char *) const *p或者 (const char) **p。

指標和const限定

指向const物件的const指標 可以定義指向const物件的const指標,形式為 const 指向型別 const 指標變數名 例如 const double pi 3.14159 const double const p pi p為指向const物件的const指標。const指標 乙個指標...

關於const 限定符

很多引用自c primer一書 比如有時候需要將乙個文字中的資料複製到另外乙個文字。我們需要使用緩衝區,緩衝區的大寫我們可以自己來決定比如1024個位元組,這是乙個常量,我們使用bufsize 1024.但是bufersize物件本身是乙個變數。所以我們可以引入const限定符,它將乙個物件轉化為常...

指標和const限定符

const int p 1,表示p指向乙個整型變數,並且該變數為const的。2,可以更改p的值,不可以更改它所指向物件的值。3,它可以指向非const型別的int變數 int const p 1,表示p指向乙個整型變數,該變數為非const的 2,不可以更改p的值,一旦初始化不可更改,單可以更改它...