首先,看以下8個題,若是您能不看任何資料的狀況下作對。那麼恭喜您,這塊應該基本沒問題了。由於再複雜的組合都是從這上面8種裏變出來的。 算法
1,定義一個整形數 數組
2,定義一個指向整形數的指針 函數
3,定義一個指向指針的指針,它指向的指針,是一個指向整形數的指針 spa
4,定義一個具備10個整形數的數組 .net
5,定義一個具備10個指針的數組,這些指針都是指向整形數的 指針
6,定義一個指向有10個整形數 數組的指針 blog
7,定義一個指向函數的指針,該函數有一個整形參數 並返回一個整形數據 內存
8,定義一個有10個指針的數組,每一個指針指向一個函數,該函數有一個整形參數,返回一個整形數 字符串
答案以下: 基礎
1,int a
這沒啥好說的。
2,int *a,
*a表示a是一個指針,左邊的int表示指針指向數據的類型。也許這會以爲是廢話,但後面一複雜,每每不知所指了。
3,int **a
4,int a[10]
5, int *a[10]
注意從這裏往下開始繞了,當* 和[]同時出現時,[]的運算級別高於*,所以首先是a[10]表示數組a有個10個元素,*a[10]表示每一個元素都是一個指針,*修飾的是a[10],而不是a。加上int表示指向數據類型
6,int (*a)[10]
首先是要求一個數組,數組裏有10個整數,也就是int a[10],而後要求有一個指針來指向這個數組,注意是指向這個數組,而不是上面5題裏的指向數組裏的每個元素a[0] a[1]。。。所以指針修飾的是數組名字a,因此寫成int (*a)[10].因爲加了括號,*優先做用於a
7, int (*f)(int) ,
這裏假設函數名字爲f,指向函數的指針寫成(*f),外面帶括號,這個要切記!緣由下面總結裏會有。函數裏面有參數,且參數爲Int型,寫成(*f)(int).最後,返回類型爲int ,在前面加上int就好了。表示返回類型.
8, int (*a[10])(int)
要求要定義一個有10個指針的數組,也就是5題類型,*a[10],這裏面的a[0] a[1]............都是指針。下面要求指針指向一個函數,寫成(*a[10])()。這裏注意衡量是不是函數的標誌就是後面要有個括號。 下面要求函數的參數是int,且返回int。故答案是int (*a[10])(int). 最終的意思是a[0] a[1] a[2]..........都是指針,每一個指針都指向函數,函數裏的參數是int返回int.
有了上面8個題的基礎,理解下面的就容易了。若是上面8個題,您不只能答對題目,還能把題目自己用語言文字描述清楚,下面就是小case。
題目1,定義一個指向函數的指針func,這個函數裏有一個參數是指向int數據的指針,返回一個int數據
答案:首先寫出(*func)(),注意這裏要帶括號,函數指針申明時左右必定有兩個括號。第一個括號表示自己的函數指針的名字,除非是int sum(int , int),sum不用括號括起來。若是是函數指針則要括起來。第二個括號表示裏面的參數。加上參數int*,和返回類型。答案是 int (*func)(int *)
題目2,定義一個指向函數的指針 func,該函數有兩個參數一個是int *p, 一個是int(*f)(int*),返回一個int。合起來就是int (*func)(int *p , int(*f)(int*)) 注意這裏的*f儘管f就一個字母但仍是要括起來。其餘很少解釋了。
題目3,int(*func[5])(int *p)
釋義:再複雜的組合都逃不掉上面8種類型。由兩個括號,則確定是函數。函數的參數是一個指向int的指針。函數的返回值是一個int。接下來就是(*func[5])這塊了,它表示func是一個指針數組,他裏面的每個元素都是一個指針,這些指針指向一個函數。
也就是說,func是一個數組,數組裏的每一個元素都是指針。準確說,(由(int*p)能夠看出)數組裏的每個元素都是函數指針,它指向的函數參數爲int*P,返回類型爲int。
題目4,int(*(*func)[5])(int *p)
釋義:首先來看模塊(*func)[5],上面已經說過,他表示func是一個指向有5個數據元素的數組的指針。數組咱們都知道int a[50],還記得咱們上面說的,50表示數組裏面元素的個數,左邊的int表示數組元素的數據類型。只要是數組,必定要告訴他裏面所放元素的類型!咱們看(*func)[5]左邊還有一個*號,而後外面纔是括號。因此咱們要先解析這個*號。這裏*就是告訴數組指針func所指向的具備5個元素的數組,裏面所放元素的類型是指針。好了,跳出括號。右邊又是一個括號。表示是函數。函數輸入參數爲int*p,返回類型爲int。
即:func是一個指向數組的指針,這個數組有5個元素,每一個元素的數據類型是函數指針,這些函數指針指向具備int*形參,返回int的函數。
題目5,int(*(*func)(int *p))[5]
釋義:首先看模塊(*func)(int *p)表示func是一個函數指針,多餘的不羅嗦了,將此模塊用a表示。也即int(*a )[5],這塊意思是a是一個指向數組的指針。等會,上面咱們提到數組必須有數組個數,以及數組元素的類型。而函數必須有參數和返回類型。對於本題,將上面合在一塊兒,也就是func是一個函數指針,它指向的函數輸入參數爲int *類型,返回類型是一個指向數組的指針,它指向的數組裏面元素個數是5,數據類型爲int。
至此,咱們總結下:
1、指針數組和數組指針的概念
指針數組是說數組裏的元素都是指針,如int *a[5],數組a裏面有5個元素,每一個元素都是指向int的指針。
數組指針是說,有一個數組int a[5],數組裏元素個數爲5,類型爲int,如今要有個指針來指向這個數組,申明爲int (*a)[5]
2、指針函數和函數指針的概念
指針函數的意思是,函數的返回類型是一個指針。如int *f(int x), 這裏f是一個函數,他的返回類型是一個指向int數據的指針。
什麼是函數指針呢?咱們趁熱打鐵,int(*f)(int x),則f就是函數指針,即指向一個函數的指針叫函數指針。這就是上面爲啥(*f)加()的緣由。
爲啥須要函數指針呢?由於函數代碼是程序中的算法指令部分,他和整形數據、各類數據同樣也是佔內存的。咱們能夠經過char *p = "hello!", printf("%s",p),經過字符串的首地址來打印字符串。所以也能夠經過函數的首地址來調用這個函數,這就是函數指針的由來。他的使用以下:
假設如今有個函數int sum(int a, int b),咱們再申明個函數指針,int (*pSum)(int a, int b)而後pSum = sum,注意sum後面不要帶括號。sum表示這個函數的首地址,這和字符串數組同樣。如此初始化函數指針後,sum(3,4)的效果和(*pSum)(3, 4)是同樣的!函數指針的用法有爭議,(*pSum)(3,4)和pSum(3,4)均可以,參見http://blog.csdn.net/megaboy/article/details/482767。但函數指針,也就是指向函數的指針申明時,*和指針名字號必定用括號括起來!函數返回的數據類型爲指針,叫指針函數,這時*和函數名是不括在一塊兒的!
將數組指針、函數指針總結在一塊:
數組指針、函數指針,*和指針名字必定要括號括起來!
3、在解析複雜指針申明時,必定要記着大原則:數組必定要告訴它元素個數和數據類型,函數必定要有形參類型和返回數據類型。