標籤:
原文地址:http://blog.csdn.net/czmpersist/article/details/9288205
上一回合講了指標記憶體與地址,最後提到了類型說明,這一回合繼續指標類型的說明。類型說明
要瞭解指標,多多少少會出現一些比較複雜的類型,今天先介紹一下如何完全理解一個複雜類型,要理解複雜類型是有規律可尋的,找到規律後一切變得很簡單,一個類型裡會出現很多運算子,他們也像普通的運算式一樣,有優先順序,其優先順序和運算優先順序一樣,所以我總結了一下其原則:
從變數名處起,根據運算子優先順序結合,一步一步分析。
下面我將用到的幾個操作符表示出來,方便大家參考,從上到下優先順序是逐漸降低的。
Associativity and Operator 操作符及其結合性 |
Function 功能 |
Use 用法 |
L |
[] |
subscript(下標) |
variable [ expr ] |
L |
() |
function call(函數調用) |
name (expr_list) |
R |
* |
dereference(解引用) |
*expr |
下面讓我們先從簡單的類型開始慢慢分析吧:
Ø 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是一個參數為一個整資料且返回一個指向由整型指標變數組成的數組的指標變數的函數。
上面這些是參考譚浩強版C語言相關說明,以及在網上尋找到的資料綜合一下的結果,協助大家好好理解指標類型。如果上面的所以情況都能理解,對於指標定義就 差不多,太多太複雜的定義在實際的開發過程中很難懂,可讀性較低,應用也就不會太廣泛,望讀者自己衡量。注意:以上所有定義以後的指標並沒有初始化,也就 是說指標所指的位置我們無法知道,這也是編程人員必須深刻認識的一點。
上面所講的只是針對int類型,對於char,double,結構體等類型原理一樣,望大家知一反三。好了,今天就講到這裡,一步一步來,不要著急,當你基礎的把握好了就可以變化,活學活用了,還是一樣,大家如果有的建議,或者沒有涉及到的,往大家指點,小弟將積極採納!
[轉]解讀C指標(2)——類型說明