理解 指針數組 數組指針 函數指針 函數指針數組 指向函數指針數組的指針

一、指針數組與數組指針先看兩行代碼,猜猜哪個是數組,哪個是指針

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個元素的數組;這個數組裏面存的是指向函數的指針;這個指針指向一些返回值類型爲指向字符的指針,參數爲指向字符的指針的函數。

來個例子看看他們的威力:

  1. #include <stdio.h>  
  2. int add(int a, int b)  
  3. {  
  4.     return a + b;  
  5. }  
  6. int sub(int a, int b)  
  7. {  
  8.     return a - b;  
  9. }  
  10. int mul(int a, int b)  
  11. {  
  12.     return a*b;  
  13. }  
  14. int div(int a, int b)  
  15. {  
  16.     return a / b;  
  17. }  
  18. int main()  
  19. {  
  20.     int x, y;  
  21.     int input = 1;  
  22.     int ret = 0;  
  23.     int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //轉移表  
  24.         while (input)  
  25.         {  
  26.             printf( "*************************\n" );  
  27.             printf( " 1:add 2:sub \n" );  
  28.             printf( " 3:mul 4:div \n" );  
  29.             printf( "*************************\n" );  
  30.             printf( "請選擇:" );  
  31.             scanf( "%d", &input);  
  32.             if ((input <= 4 && input >= 1))  
  33.             {  
  34.                 printf( "輸入操作數:" );  
  35.                 scanf( "%d %d", &x, &y);  
  36.                 ret = (*p[input])(x, y);  
  37.             }  
  38.             else  
  39.                 printf( "輸入有誤\n" );  
  40.             printf( "ret = %d\n", ret);  
  41.         }  
  42.         return 0;  
  43. }  
  1. 這計算器還可以吧,看看運算結果如何  

四、叨叨幾句,不要看起來很複雜,其實學起來也複雜,但是學懂了會很有趕腳。
好好學習,天天向上大笑
初學者歡迎大家指正




轉自:http://blog.csdn.net/qq_38646470/article/details/78596047
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章