一、指針數組與數組指針先看兩行代碼,猜猜哪個是數組,哪個是指針
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;
- }
- 這計算器還可以吧,看看運算結果如何
初學者歡迎大家指正
轉自:http://blog.csdn.net/qq_38646470/article/details/78596047