亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何掌握C語言編程函數指針

發布時間:2021-10-23 10:23:26 來源:億速云 閱讀:102 作者:iii 欄目:開發技術

這篇文章主要講解了“如何掌握C語言編程函數指針”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何掌握C語言編程函數指針”吧!

目錄
  • 一、指針引子

  • 二、使用步驟

    • 1.取函數地址

    • 2.創建函數指針

    • 3.通過函數指針調用函數的兩種方法

  • 三、函數指針進階

    一、指針引子

    示例:我們常常接觸的指針大多有如下幾類:
    整形指針-存放整形地址,指向整形
    字符指針-存放字符地址,指向字符
    數組指針-存放數組地址(注意不是數組首元素地址),指向數組

    由以上三個例子,我們能總結指針的共同點:存放某個類型變量的地址,指向那個類型的變量,但是在講函數指針首先有一個問題:函數也有地址嗎?我們用一段簡單的代碼來驗證一下即可。

    #include<stdio.h>
    int Add(int x,int y)
    {
       return x+y;
    }
    int main()
    {
       printf("%p\n",&Add);
       return 0;
    }

    屏幕上打印出地址:

    如何掌握C語言編程函數指針

    所以答案是有的,函數也存在地址,那么也就衍生出了今天的知識點-函數指針。

    二、使用步驟

    1.取函數地址

    我們知道&數組名,取出的是數組的地址。單獨一個數組名,取出的是數組首元素的地址。但是對于函數來說:函數名==&函數名

    我們代碼驗證一下(示例):

    #include<stdio.h>
    int Add(int x,int y)
    {
       return x+y;
    }
    int main()
    {
       printf("%p\n",&Add);
       printf("%p\n",Add);
       return 0;
    }

    如何掌握C語言編程函數指針

    顯然,打印出來的地址是一樣的,但是這個時候也會有同學跳出來說:“那數組名和&數組名打印出來的地址還一樣呢,但意義明顯不一樣啊”。但是你想想,函數也沒有首元素等其他玩意啊,它就是它本身啊,它也不會出現什么函數首元素啊。

    所以再次聲明:
    在函數指針這一塊 函數名==&函數名,它的意義和值,都是一樣的

    2.創建函數指針

    我們知道,數組指針用來存放數組地址,整形指針用來存放整形地址。。。函數指針也不例外,它用來存放函數地址,我們現在定義一個p來存放Add地址,那它的類型怎么創建?我們來看一下具體步驟:

    1.p是一個指針對吧,給它一個*是不是必須的 p變成了 * p。為了確保 * 和 p結合(如果沒有括號,*或者p有可能會與其他的一些符號結合,具體參見符號優先級)那我在 * p外面加一個括號便于觀看也沒有問題吧,也就是(*p)

    2.那函數總得有參數啊,比如這里是Add(int x,int y)。參數x和y的類型是int
    你指針指向的函數是不是要找一下它的參數。所以(*p)(int,int)

    3.那函數還有一個性質啊,有沒有返回值,要是有的話,類型呢? 這里以Add為例,它是返回int型,所以我們指針也返回int 型 即int(*p)(int,int)

    到這里Add函數指針的類型就創建完成啦即為*int(p)(int ,int)

    需要注意的是:不同函數的參數類型和返回值類型是不一樣的,到時候需要根據不同函數對類型進行轉換,這里只是以Add函數為例,其他函數以此類推

    ps:一個快速判別類型的方法——去掉變量的名字,剩下的就是類型
    代碼如下(示例):

    	int a = 10;//去掉a 類型int
    	int arr[10] = { 0 };//去掉arr 類型int [10]
    	int(*parr)[10] = &arr;//去掉parr 類型int(*)[10],數組指針,指向一個10int型元素的數組
    	int(*pf)(int, int) = &Add;//去掉pf 類型int(*)(int,int)

    3.通過函數指針調用函數的兩種方法

    法一:
    我們平時在調用函數的時候,一般就是函數名( ,)然后把參數傳進括號即可,那我們現在有函數指針了呀,指針怎么使用?p不是指向了函數Add嘛,我們用*解引用指針,得到的是地址里的東西,也就是說 *p==Add,用 * p(,)來傳參也可以實現Add函數的調用。代碼如下:

    #include<stdio.h>
    int Add(int x, int y)
    {
    	return x + y;
    }
    int main()
    {
    	int ret = Add(2, 3);
    	printf("%d\n", ret);//ret=5
    	int(*p)(int, int) = &Add;//p是一個指向函數Add的指針
    	ret = (*p)(3, 3);//ret=6
    	//p指向Add,對p解引用就是Add
    	//簡言之:*p=Add
    	//我們并不總是可以拿到變量,有時是拿到變量的地址
    	//對應函數指針同樣的道理,有時不直接給你函數,給你函數地址,就這樣調用
    	printf("%d\n", ret);
    }

    法二:
    我們在二.1取函數地址那一塊介紹了,在函數指針這一塊,函數名==&函數名, 也就是說創建函數指針的時候可以這樣寫:int(*p)(int, int) = Add,Add是賦給了p啊,你也可以認為:p就是Add。你可以這樣理解,法一是int(*p)(int, int) = &Add,是把Add的地址給p,所以用p來調用函數要解引用一下,但是法二p就是Add,那不用解引用了,直接調用。代碼如下:

    #include<stdio.h>
    int Add(int x, int y)
    {
    	return x + y;
    }
    int main()
    {
    	//我們由前面的知識知道:函數add取地址時,add=&add
    	int(*p)(int, int) = Add;//把Add賦給p,這里p即可看做Add
    	//與法一不同的是,法一將&Add賦給p,p是Add的地址,所以要解引用,這里p就可以看做是Add本身,可以不解引用
    	int ret = p(3, 6);
    	printf("%d", ret);
    }//如果是為了方便理解,一般是用第一種方法,如果是為了操作方便,可以用第二種方法

    三、函數指針進階

    大家來看這樣一個代碼( * (void(*)() ) 0)(),乍一看非常復雜,我們來細化一下
    1 . ( * (void( * )() ) 0)() 我們抽出加粗部分
    這是我們熟悉的老朋友:void( * )(),這不就是一個函數指針嘛,該函數無參,返回類型void

    2 . (void( * )() ) 0是什么?我們聯想一下(int)3.14,不就是對3.14強制類型轉換嘛,將3.14這個浮點型強制轉換成整形。這里同樣的道理,是將整形0強制轉換成類型為void( * )()的一個函數指針

    3 .現在有了(void( * )() ) 0,我們在這個東西前面加一個 *,這個是什么意思,我們知道(void( * )() ) 0已經被轉換成一個指針(指針即地址)了,地址前面加一個 *表示解引用,取出地址里的東西,也就是找到了那個函數

    4 .(void( * )() ) 0表示那個函數那再在后面加一個()即是對函數的調用,也就是( * (void(*)() ) 0)()

    感謝各位的閱讀,以上就是“如何掌握C語言編程函數指針”的內容了,經過本文的學習后,相信大家對如何掌握C語言編程函數指針這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    永平县| 瓮安县| 余干县| 枣强县| 五常市| 玉田县| 古浪县| 灌阳县| 康保县| 乐清市| 长岛县| 互助| 沙河市| 吴桥县| 永泰县| 黑河市| 阳新县| 南江县| 建水县| 新田县| 安国市| 镶黄旗| 武川县| 华阴市| 榆中县| 永安市| 辉南县| 葫芦岛市| 正安县| 饶阳县| 交城县| 疏附县| 开阳县| 彩票| 孙吴县| 黄骅市| 中方县| 望都县| 合川市| 山西省| 龙岩市|