理解 指標陣列 陣列指標 函式指標 函式指標陣列 指向函式指標陣列的指標
一、指標陣列與陣列指標先看兩行程式碼,猜猜哪個是陣列,哪個是指標
int *p[5];
int (*p)[5];
有沒有很簡單,但是有很多初學者很是分不清楚;第一個是指標陣列,第二個是陣列指標。且看小僧給大家捋一捋,首先要明白符號優先順序問題,“[ ]”的優先順序高於“*”,所以p先和誰結合就表示誰。"int *p[5]" p先和[ ]結合,理所當然是陣列了,只不過陣列元素為 int * 型;"int (*p)[5]" “()”的優先順序高於“[ ]”,p先和“*”結合,理所當然是指標,只不過該指標指向 int 型陣列的內容,是不是搜一賊。
指標陣列:首先他是一個數組,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。
陣列指標:首先他是一個指標,他指向一個數組。是不是很難懂,且看下圖
希望你們看了不會太暈
二、函式指標,函式指標陣列
函式指標,看到這裡你肯定會照貓畫虎,(首先他是一個指標,他指向一個函式)很對,就是這樣的。接下來我們細細研究,先看張圖
來幾片程式碼瞧一瞧
(1) char *(*fun1)(char *p1,char *p2);(2) char * *fun2(char p1,char p2);
有沒有很複雜的樣子,第一題看起來像函式,其實他是函式指標,fun1是指標變數,他指向一個函式。這個函式有兩個指標型別的引數,返回值為 char * 型;第二題看起來像指標,其實他是一個函式,fun2是函式名,引數為兩個指標,返回值為 char 型二級指標。 函式指標也很簡單吧,其實他和普通指標一樣,我們使用他的好處在於,可以將實現同一功能的多個模組統一起來標識,這樣可以使函式的介面與實現分開。
三、函式指標陣列,函式指標陣列指標(有了上面了的基礎我們很容易掌握這兩個)
函式指標陣列:首先它是一個數組,陣列元素為函式指標。(不幹說,還是來個栗子:char *(* a[4])(char *p);它是一個數組,陣列名為 a ,陣列內有四個指向函式的指標;這個指標指向一些返回值型別為指向字元的指標,引數為指向字元的指標的函式。)
函式指標陣列指標:首先它是一個指標,這個指標指向陣列,這個數組裡面存的都是指向函式的指標。(不怕,來個栗子就好了:char (*(* a)[4])(char *p); 這個指標指向包含了4個元素的陣列;這個數組裡面存的是指向函式的指標;這個指標指向一些返回值型別為指向字元的指標,引數為指向字元的指標的函式。
來個例子看看他們的威力:
#include <stdio.h> int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int mul(int a, int b) { return a*b; } int div(int a, int b) { return a / b; } int main() { int x, y; int input = 1; int ret = 0; int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //轉移表 while (input) { printf( "*************************\n" ); printf( " 1:add 2:sub \n" ); printf( " 3:mul 4:div \n" ); printf( "*************************\n" ); printf( "請選擇:" ); scanf( "%d", &input); if ((input <= 4 && input >= 1)) { printf( "輸入運算元:" ); scanf( "%d %d", &x, &y); ret = (*p[input])(x, y); } else printf( "輸入有誤\n" ); printf( "ret = %d\n", ret); } return 0; }
這計算器還可以吧,看看運算結果如何
四、叨叨幾句,不要看起來很複雜,其實學起來也複雜,但是學懂了會很有趕腳。 好好學習,天天向上
初學者歡迎大家指正