最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言編程函數(shù)指針入門精講教程

 更新時間:2021年10月22日 17:16:39   作者:高郵吳少  
大家在C語言的學(xué)習(xí)中一定會接觸指針這樣一個東西,而指針也是新手路上一定要消滅的boss,如果以后還要學(xué)習(xí)Java的同學(xué)更是要注重指針的學(xué)習(xí),希望能夠有所幫助

一、指針引子

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

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

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

屏幕上打印出地址:

在這里插入圖片描述

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

二、使用步驟

1.取函數(shù)地址

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

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

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

在這里插入圖片描述

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

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

2.創(chuàng)建函數(shù)指針

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

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

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

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

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

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

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

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

3.通過函數(shù)指針調(diào)用函數(shù)的兩種方法

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

#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是一個指向函數(shù)Add的指針
	ret = (*p)(3, 3);//ret=6
	//p指向Add,對p解引用就是Add
	//簡言之:*p=Add
	//我們并不總是可以拿到變量,有時是拿到變量的地址
	//對應(yīng)函數(shù)指針同樣的道理,有時不直接給你函數(shù),給你函數(shù)地址,就這樣調(diào)用
	printf("%d\n", ret);
}

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

#include<stdio.h>
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	//我們由前面的知識知道:函數(shù)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);
}//如果是為了方便理解,一般是用第一種方法,如果是為了操作方便,可以用第二種方法

三、函數(shù)指針進(jìn)階

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

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

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

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

總結(jié)

提示:本文介紹了函數(shù)指針的原理和多種使用方法,對于函數(shù)指針想要進(jìn)階提升的小伙伴一定要認(rèn)真研讀本文中的進(jìn)階題目,指針是一個大頭,但相信堅持不懈的你一定可以戰(zhàn)勝它,加油!

更多關(guān)于C語言函數(shù)指針的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解讀C++編程的相關(guān)文件操作

    解讀C++編程的相關(guān)文件操作

    這篇文章主要介紹了解讀C++編程的相關(guān)文件操作,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C語言編程動態(tài)內(nèi)存分配常見錯誤全面分析

    C語言編程動態(tài)內(nèi)存分配常見錯誤全面分析

    這篇文章主要介紹了C語言編程中動態(tài)內(nèi)存分配的常見錯誤全面分析講解,同樣遇到過C語言動態(tài)內(nèi)存分配各種問題的同學(xué)可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • c語言全盤搜索指定文件的實(shí)例代碼

    c語言全盤搜索指定文件的實(shí)例代碼

    c語言全盤搜索指定文件的實(shí)例代碼,需要的朋友可以參考一下
    2013-03-03
  • C語言結(jié)構(gòu)體超詳細(xì)講解

    C語言結(jié)構(gòu)體超詳細(xì)講解

    C語言結(jié)構(gòu)體(Struct)從本質(zhì)上講是一種自定義的數(shù)據(jù)類型,只不過這種數(shù)據(jù)類型比較復(fù)雜,是由?int、char、float?等基本類型組成的。你可以認(rèn)為結(jié)構(gòu)體是一種聚合類型
    2022-04-04
  • C語言 經(jīng)典題目螺旋矩陣 實(shí)例詳解

    C語言 經(jīng)典題目螺旋矩陣 實(shí)例詳解

    這篇文章主要介紹了C語言 經(jīng)典題目螺旋矩陣 實(shí)例詳解的相關(guān)資料,這里附有代碼實(shí)例及實(shí)現(xiàn)效果圖,需要的朋友可以參考下
    2016-12-12
  • C語言實(shí)現(xiàn)十六進(jìn)制與二進(jìn)制的相互轉(zhuǎn)換

    C語言實(shí)現(xiàn)十六進(jìn)制與二進(jìn)制的相互轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了如何利用c語言實(shí)現(xiàn)將文件中十六進(jìn)制數(shù)據(jù)與二進(jìn)制數(shù)據(jù)相互轉(zhuǎn)換,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的可以學(xué)習(xí)一下
    2022-11-11
  • C/C++?Qt?數(shù)據(jù)庫QSql增刪改查組件應(yīng)用教程

    C/C++?Qt?數(shù)據(jù)庫QSql增刪改查組件應(yīng)用教程

    Qt?SQL模塊是Qt中用來操作數(shù)據(jù)庫的類,該類封裝了各種SQL數(shù)據(jù)庫接口,可以很方便的鏈接并使用。本文主要介紹了Qt數(shù)據(jù)庫QSql增刪改查組件的應(yīng)用教程,感興趣的同學(xué)可以學(xué)習(xí)一下
    2021-12-12
  • C++實(shí)現(xiàn)LeetCode(93.復(fù)原IP地址)

    C++實(shí)現(xiàn)LeetCode(93.復(fù)原IP地址)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(93.復(fù)原IP地址),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++深入探究二階構(gòu)造模式的原理與使用

    C++深入探究二階構(gòu)造模式的原理與使用

    C++中經(jīng)常會因為調(diào)用系統(tǒng)資源失敗導(dǎo)致出現(xiàn)BUG,所以在類調(diào)用構(gòu)造函數(shù)需要分配系統(tǒng)資源時會出現(xiàn)BUG,從而導(dǎo)致類對象雖然被創(chuàng)建,但是只是個半成品,為了避免這種情況需要使用二階構(gòu)造模式
    2022-04-04
  • C++使用string的大數(shù)取模運(yùn)算(5)

    C++使用string的大數(shù)取模運(yùn)算(5)

    這篇文章主要為大家詳細(xì)介紹了C++使用string的大數(shù)取模運(yùn)算,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09

最新評論

焦作市| 威海市| 肥城市| 海林市| 商南县| 松江区| 宿松县| 舟曲县| 黄浦区| 乌拉特后旗| 莱阳市| 黄大仙区| 海兴县| 林甸县| 中卫市| 抚州市| 韶山市| 桦甸市| 通渭县| 滨州市| 汾西县| 晋宁县| 萍乡市| 道真| 电白县| 绥化市| 唐海县| 新密市| 泸定县| 北京市| 溧阳市| 巫溪县| 丰宁| 翼城县| 巴中市| 聂拉木县| 西畴县| 海安县| 成武县| 巴东县| 南开区|