C語言 複雜指標的申明問題 數組指標 指標數組 函數指標 指標函數

來源:互聯網
上載者:User

  首先,看如下8個題,如果您能不看任何資料的情況下做對。那麼恭喜您,這塊應該基本沒問題了。因為再複雜的組合都是從這上面8種裡變出來的。

1,定義一個整形數

2,定義一個指向整形數的指標

3,定義一個指向指標的指標,它指向的指標,是一個指向整形數的指標

4,定義一個具有10個整形數的數組

5,定義一個具有10個指標的數組,這些指標都是指向整形數的

6,定義一個指向有10個整形數 數組的指標

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。

至此,我們總結下:

一、指標數組和數組指標的概念

      指標數組是說數組裡的元素都是指標,如int *a[5],數組a裡面有5個元素,每個元素都是指向int的指標。

數組指標是說,有一個數組int a[5],數組裡元素個數為5,類型為int,現在要有個指標來指向這個數組,申明為int (*a)[5]

二、指標函數和函數指標的概念

      指標函數的意思是,函數的傳回型別是一個指標。如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。但函數指標,也就是指向函數的指標申明時,*和指標名字型大小一定用括弧括起來!函數返回的資料類型為指標,叫指標函數,這時*和函數名是不括在一起的!

將數組指標、函數指標總結在一塊:

           數組指標、函數指標,*和指標名字一定要括弧括起來!

三、在解析複雜指標申明時,一定要記著大原則:數組一定要告訴它元素個數和資料類型,函數一定要有形參類型和返回資料類型。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.