有關指標的複雜型別

2021-05-08 02:47:07 字數 1319 閱讀 5394

要理解指標, 尤其是和一些其他型別修飾符放在一起的指標, 看上去很難,其實不然。

乙個型別宣告裡會出現很多修飾符,他們就像普通的表示式一樣,有優先順序和結合性。只要掌握了這些規律,

分析乙個複雜的指標型別就很容易了。

分析時, 先從變數名開始,然後根據修飾符的優先順序結合性,一步一步分析。

下面看幾個最常用的例子:

int p;  // 普通的int變數

int *p; // 首先從p開始, p先與*結合,表明p是乙個指標。然後再與int結合, 表明p指向的是int型別。所以p是乙個指向int型別的指標。

一般的,我們稱之為整型指標。

int  p[3] : p先與結合,表明p是乙個陣列。然後與int結合,表明陣列的元素是int型別的。因此p是乙個整型的陣列。

int *p[3]: 的優先順序比*高,所以p先與結合,表明p是乙個陣列,再與*結合,表明陣列裡的元素是指標。再與int結合,表明指標指向的是int。所以p是乙個陣列,陣列元素是整型指標(int*). 很多書裡說陣列就是指標,這是不確切的。陣列和指標是兩個不同的型別。切記!

int (*p)[3] : 這裡的括號,讓p與*先結合。表明p是乙個指標。然後再與結合,表明指標指向的型別是陣列。再與int結合,表明陣列的元素是int型別的。 所以p是乙個指向整型陣列的指標。

在這裡,int *和int (*)是兩個不同的型別。

int **p; p為典型的二級指標。

int p(int): p首先與()結合,表明p是乙個函式。進入()分析,說明該函式有乙個int型別的引數。再與外面的int結合,表明函式的返回值是乙個int。 所以p是乙個引數型別為int,返回值為int的函式。

int (*p)(int) : 從p處開始,先與指標結合,表明p是乙個指標。然後再與()結合,表明該指標指向的是乙個函式。然後再與()裡的int結合,表明函式有乙個int型別的引數。再與最外層的int結合,表明函式的返回值是int。 這裡的p是乙個典型的函式指標。

int *(*p(int))[3] : 這個看上去很複雜。從p開始,先與()結合,表明p是乙個函式,然後進入(),與int結合,表明函式的引數為int。

再與外面的*結合,表明函式的返回值型別是指標。然後再到最外面一層,先與結合,表明返回指標指向的是乙個數                               組。再與最外面的*結合,表明陣列的元素是指標,再與最後的int結合,表明陣列的元素指標指向的是int型別。

所以p是乙個函式, 引數為int, 返回值為指向int* 的指標。

這確實很複雜,同樣的,對於編譯器的設計來說,更為複雜。但是這也是c為什麼長盛不衰的原因了。因為c的設計真的很精妙。發明

c語言的是個天才。我只能這樣說。

Golang 複雜型別的指標

在go語言中,沒有最複雜的指標運算的部分,只留下了獲取指標 運算子 和獲取物件 運算子 的運算 a,b 3,5 pa,pb a,b fmt.println pa,pb 對於一些複雜型別的指標,如果要訪問成員變數的話,需要寫成類似 p field的形式,go提供了隱式解引用特性,我們只需要p.fiel...

派生複雜型別

複雜型別都是通過限制或擴充套件其他的型別來派生,通過限制派生的新型別的值範圍是基型別值範圍的自己,新型別的所有例項對於基型別也是有效的,而擴充套件則可以為現有型別新增新的元素和屬性,基型別的例項對於擴充套件型別不一定有效。從簡單型別或另乙個具有簡單內容的複雜型別派生複雜型別時,使用 xs conte...

Entity Framework 複雜型別

為了說明什麼是複雜屬性,先舉乙個例子。public class companyaddress public string companyname public string streetaddress public string city public string state public str...