指標從來都是乙個難以消化的知識,你需要透過表象看到其本質,才會讓你加深對指標的認識。
指標,顧名思義,這是乙個儲存某個變數位址的變數。該位址指向某個變數,就像指標一樣,所以這個變數叫做指標。
接下來讓我們看看下面這些包含指標的傢伙到底是些什麼東西。我們只看這個名字,會發現其本質是乙個陣列,而指標看起來更像是乙個「形容詞」。
那麼什麼是指標陣列呢?
舉個例子,我們建立乙個陣列arr,裡面可以放整形元素例如;也可以放一些字元;那麼有一堆指標,我們想把它們存起來,能不能放到陣列裡面呢?答案是可以的。而這個存放指標的陣列就叫做指標陣列。
指標陣列的型別如下:
型別 *陣列名[ ];
int *arr[10];
char *api[20];
就像指標陣列那樣,我們先按照其名字分析一下它的本質是什麼。」陣列」像是乙個形容詞形容」指標」,那麼陣列指標的本質就是指標啦。陣列指標指的就是存放某個陣列位址的指標。對其解引用可以得到這個陣列。(注意:這個指標存放的是整個陣列的位址,而非陣列首元素的位址!!!)
陣列指標的型別如下:
型別 (*指標名)[ ] = &arr;(&arr就是傳說中的某個陣列的位址了)
int (*parr)[10] = &arr1;
char (*parr)[20] = &arr2;
( )優先順序最高,因此*parr先結合,這表示parr是乙個指標。接下來是下標引用,所以parr指向的是乙個陣列。這個宣告表示式中沒有更多的操作符,所以陣列的每個元素都是整形。
知道了陣列指標的本質,讓我們繼續深究一下它到底是怎麼用的。
int arr[3][5] = ;
int (*parr)[5] = arr;
我們來分析一下。陣列名單獨放置可以表示該陣列首元素的位址,那麼對於二維陣列arr[3][5],arr所表示的位址其實是arr[0]的位址。在二維陣列arr裡,我們可以把arr[0]當做乙個陣列名對待,這個陣列中有五個元素。因此:int (*parr)[5] = &arr[0];
也就是說parr指向二維陣列arr第一行的位址。int (*parr[10])[5];
這個東西它到底是乙個陣列還是乙個指標呢?
別著急,這個看似複雜的宣告只要我們一步步分析,總會找到正確的結果的。首先從優先順序來看,()中的下標引用優先順序最高,它和parr先結合,那麼首先確定這個複雜的宣告本質是乙個陣列parr[10]。我們去掉parr[10]後發現這個宣告變成int (*)[5];這代表指向大小為5個整形元素的陣列的指標。那麼這些指標怎麼存放呢?還記得parr[10]嗎,沒錯,就存放在陣列parr裡面。
因此這個宣告的含義是宣告能存放是個指標的指標陣列parr,其中每個指標可以指向乙個大小為5個整形元素的陣列。我們知道乙個整形數它有位址,乙個字元它有位址,甚至陣列也有它自己的位址。那麼我們平常使用的函式其實也有自己的位址。
函式指標型別如下:
返回型別 (*指標名)(函式引數型別);
int add(int a,int b)
int (*pfun)(int ,int) = add;
printf("%d\n",pfun(1,2));
這其中使用了通過函式指標呼叫函式,對於函式add();可以直接呼叫pfun();函式指標陣列就是存放返回型別和引數型別一致的若干函式指標的陣列。返回型別和引數一致這個條件很關鍵!
關於函式指標陣列的定義:
int (*pfunarr[4])(int ,int);
其中pfunarr[4]表示陣列,去掉pfunarr[4]後…
int (*)(int ,int);
這是乙個函式指標型別,這就說明陣列pfunarr[4]中包含元素種類就是函式指標了。
那麼接下來我們寫一段**看看到底是怎麼定義函式指標陣列的。
int add(int x,int y)
int sub(int x,int y)
int (*pfunarr[2])(int ,int) = ;//方法一
typedef int (*pfun_t)(int ,int);
pfun_t pfunarr = ;//方法二
方法一用類似於陣列定義方式直接定義,簡單粗暴。
方法二採用typedef作為輔助,首先用typedef宣告了乙個函式指標陣列型別pfun_t,在用此型別定義乙個函式指標陣列變數pfunarr並將其初始化。
使用方法如下:
#includeint main()
return 0;
}
如上,如果要呼叫函式指標陣列中的內容時,只需要
陣列名[函式指標對應下標](對應型別引數)即可。
這名字夠繞口的…其實這就是乙個指標,它指向我們上面所提到的函式指標陣列。
指向函式指標陣列的指標的定義:
int (*arr[5])(int ,int) = ;//這定義了乙個大小為5的函式指標陣列。
int (*(*p)[5])(int ,int) = &arr;//指標p就是指向函式指標陣列arr的指標。
怎麼理解這個定義方式呢?
首先*和p先結合,表明p是乙個指標。去掉*p後,剩下了
int ( *[5])(int ,int);
我們發現這就是乙個函式指標陣列型別。所以這個定義方式我們就可以理解啦。
呼叫方式如下:
int ret = (*p)[1](1,2);
*p解引用後得到陣列arr相當於陣列名,那麼arr [1] (1,2)呼叫了函式add並且傳入引數1,2。 指標相關的理解
include using namespace std intmain include using namespace std intcal char str 當用函式傳遞陣列指標時就退化為指標 intcalcal char str intmain include using namespace s...
指標理解及相關知識
引言 c語言中一種重要的資料型別就是指標,指標是c語言的特色之一。正確靈活地運用指標,可以使程式編寫簡潔,緊湊,高效。利用指標變數可以有效地表示各種複雜的資料結構,如佇列 queue 棧 stack 鍊錶 linked table 樹 tree 圖 graph 等等,正是由於複習資料結構,發現當時c...
深度理解指標及相關概念
2.指標變數 指標變數是變數,具有儲存空間。就像int,float等型別一樣,當然,指標有別的變數不具有的特殊用法。1.指標的型別 我們將type 叫做指標的型別,type指的是指標所指向的型別,type是指最後乙個 之前所有的東西,例如 char p,它的type部分就為char char p,它...