常量指針(指向常量的指針)和指針常量


首先要貼一段文檔

int p; //這是一個普通的整型變量

int *p; //首先從P 處開始,先與*結合,所以說明P 是一個指針,然后再與int 結合,說明指針所指向的內容的類型為int 型.所以P 是一個返回整型數據的指針

int p[3]; //首先從P 處開始,先與[]結合,說明P 是一個數組,然后與int 結合,說明數組里的元素是整型的,所以P 是一個由整型數據組成的數組

int *p[3]; //首先從P 處開始,先與[]結合,因為其優先級比*高,所以P 是一個數組,然后再與*結合,說明數組里的元素是指針類型,然后再與int 結合,說明指針所指向的內容的類型是整型的,所以P 是一個由返回整型數據的指針所組成的數組

int (*p)[3]; //首先從P 處開始,先與*結合,說明P 是一個指針.然后再與[]結合(與"()"這步可以忽略,只是為了改變優先級),說明指針所指向的內容是一個數組,然后再與int 結合,說明數組里的元素是整型的.所以P 是一個指向由整型數據組成的數組的指針

int **p; //首先從P 開始,先與*結合,說是P 是一個指針,然后再與*結合,說明指針所指向的元素是指針,然后再與int 結合,說明該指針所指向的元素是整型數據.由於二級指針以及更高級的指針極少用在復雜的類型中,所以后面更復雜的類型我們就不考慮多級指針了,最多只考慮一級指針.

int p(int); //從P 處起,先與()結合,說明P 是一個函數,然后進入()里分析,說明該函數有一個整型變量的參數,然后再與外面的int 結合,說明函數的返回值是一個整型數據

int (*p)(int); //從P 處開始,先與指針結合,說明P 是一個指針,然后與()結合,說明指針指向的是一個函數,然后再與()里的int 結合,說明函數有一個int 型的參數,再與最外層的int 結合,說明函數的返回類型是整型,所以P 是一個指向有一個整型參數且返回類型為整型的函數的指針

int *(*p(int))[3]; //從P 開始,先與()結合,說明P 是一個函數,然后進入()里面,與int 結合,說明函數有一個整型變量參數,然后再與外面的*結合,說明函數返回的是一個指針,然后到最外面一層,先與[]結合,說明返回的指針指向的是一個數組,然后再與*結合,說明數組里的元素是指針,然后再與int 結合,說明指針指向的內容是整型數據.所以P 是一個參數為一個整數據且返回一個指向由整型指針變量組成的數組的指針變量的函數. //說到這里也就差不多了,我們的任務也就這么多,理解了這幾個類型,其它的類型對我們來說也是小菜了,不過我們一般不會用太復雜的類型,那樣會大大減小程序的可讀性,請慎用,這上面的幾種類型已經足夠我們用了.

 

現在來分析特別的:const char *pStr和char * const pStr。我不知道以下這樣理解是否正確,如果你有更好的意見請給我留言指出錯誤或不足,我非常的感謝你!

在看到上面的資料之后我是這樣理解const char *pStr和char * const pStr的。

const char *pStr;

1、首先pStr左結合沒有const關鍵字,說明pStr是一個變量而非常量

2、與*結合,說明pStr是一個指針變量

3、與char結合,說明pStr是一個指向字符類型的指針變量

4、與const結合,說明pStr是一個指向常量字符類型的指針變量(明顯不對,pStr應該是一個指向常量字符串類型的指針變量)

char * const pStr;

1、首先pStr左結合有const關鍵字,說明pStr是一個常量而非變量

2、與*結合,說明pStr是一個指針常量

3、與char結合,說明pStr是一個指向字符類型的指針常量(明顯不對,pStr應該是一個指向字符串類型的指針常量)

 

常量指針和指針常量,說實在話我對這個理解起來真的很難。之前對這個知識點是似懂非懂的狀態,每到要用的的時候總要去翻書,經常搞混淆。在看到上面的資料之后我才明白了。對於變量的定義也能舉一反三,只要理解了就簡單了。

  可是,在寫這篇博文時我又迷惑了,於是又找資料看。鏈接在此:http://www.cnblogs.com/rushuizhijing/archive/2011/08/26/2154737.html#2328051。看了這篇博文后,對於這個知識點又加深了理解,以前的理解全是在指針的限制層面,而這篇博文讓我看到了最底層的內存的限制層面。不過有個疑問:“由於沒有 const *的運算”這是什么意思?

現在,我是這樣理解const char *pStr和char * const pStr的。

const char *pStr;

1、首先應該把const char *pStr分解為const char *和pStr分別來看,那么pStr是const char *類型的變量既pStr指向一個常量字符串。或者說pStr對應內存中存放着另一內存的地址,這一內存存放的是字符串(內存中的數據是可讀可寫的,除了系統敏感區,如操作系統內核所在區域),const關鍵字只是限定了我們程序員只能對這片內存進行只讀操作。至於pStr對應內存我們可以隨便讀寫。

char * const pStr;

1、首先應該把char * const pStr分解為char *和const pStr分別來看,那么pStr是char *類型的常量既pStr指向一個字符串。或者說pStr對應內存中存放着另一內存的地址,這一內存存放的是字符串(內存中的數據是可讀可寫的,除了系統敏感區,如操作系統內核所在區域),const關鍵字只是限定了我們程序員只能對pStr對應內存進行只讀操作。至於存放字符串的這一內存我們可以隨便讀寫。

  

  寫到最后,我不禁懷疑自己是不是太笨了,我不敢肯定是否正確理解了。太晚了,弄了好幾個小時,腦子有點糊塗啦。

  於是,懇請各位朋友發表你的看法,幫助我理解。在此感謝你!

 

更正:

1:

const char *pStr = "Hello World";  // pStr是一個指向常量字符串的指針變量

pStr = "hello";  // pStr可以指向另一個常量字符串

pStr[0] = 'N';  // Error,這里pStr[0]操作的是常量字符串的字符

 

2:

char * const pStr = "Hello World";  // pStr是一個指向字符串的指針常量

pStr = "Hello";  // Error,這里pStr是一個常量,初始化后就不能再改變它的值了(與"Hello World"綁定了),相當於引用。

pStr[0] = 'N';  // OK,這里pStr[0]操作的是字符串的字符


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM