亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++ 函數(shù)指針詳細(xì)總結(jié)

 更新時(shí)間:2021年11月16日 11:11:25   作者:梁唐  
這篇文章主要介紹了C++ 函數(shù)指針內(nèi)容,下面文章圍繞C++ 函數(shù)指針的相關(guān)資料展開(kāi)詳細(xì)內(nèi)容,包括函數(shù)指針的進(jìn)階內(nèi)容,需要的朋友可以參考一下,希望對(duì)大家有所幫助

1、函數(shù)指針

函數(shù)指針顧名思義,就是指向函數(shù)的指針。

和數(shù)據(jù)類(lèi)似,C++當(dāng)中函數(shù)也有地址,函數(shù)的地址是存儲(chǔ)函數(shù)機(jī)器語(yǔ)言代碼的內(nèi)存地址。我們可以將另外一個(gè)函數(shù)的地址作為參數(shù)傳入函數(shù),從而實(shí)現(xiàn)函數(shù)的靈活調(diào)用。

1.1 獲取函數(shù)地址

獲取函數(shù)地址的方法非常簡(jiǎn)單,只要使用函數(shù)名(后面不跟參數(shù)和括號(hào))即可。比如我們有一個(gè)函數(shù)叫做think,那么think()是調(diào)用函數(shù)拿到結(jié)果,而think則是獲取函數(shù)的地址。

如果我們想要將think函數(shù)當(dāng)做參數(shù)傳入另外一個(gè)函數(shù),我們可以這么寫(xiě):

func(think);

1.2 聲明函數(shù)指針

聲明函數(shù)指針和聲明函數(shù)類(lèi)似,我們聲明一個(gè)函數(shù)可以這么寫(xiě):

double process(int);


而我們聲明函數(shù)指針則可以寫(xiě)成這樣:

double (*pt)(int);


如果我們把(*pt)替換成函數(shù)名的話(huà),這其實(shí)就是一個(gè)函數(shù)的聲明。如果(*pt)是函數(shù)的話(huà),那么pt自然就是指向函數(shù)的指針了。

1.3 函數(shù)指針傳參

如果我們要實(shí)現(xiàn)一個(gè)函數(shù),它的一個(gè)參數(shù)是一個(gè)函數(shù)指針,它的寫(xiě)法和剛才一樣:

double func(double x, double (*pt)(int));


在這個(gè)聲明當(dāng)中,它的第二個(gè)參數(shù)是一個(gè)函數(shù)指針。指向的函數(shù)接收一個(gè)int參數(shù),返回一個(gè)double結(jié)果。

1.4 調(diào)用函數(shù)

最后, 我們來(lái)看下通過(guò)指針調(diào)用函數(shù)的部分。

其實(shí)也非常簡(jiǎn)單,因?yàn)槲覀兦懊嬲f(shuō)了(*pt)的效果和函數(shù)是一樣的,我們之前通過(guò)函數(shù)名調(diào)用函數(shù),那么我們只需要改成通過(guò)(*pt)調(diào)用即可。

如:

double process(int);
double (*pt)(int);

pt = process;
cout << (*pt)(5) << endl;

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

簡(jiǎn)單的函數(shù)指針比較簡(jiǎn)單,但對(duì)于復(fù)雜的情況則顯得有些恐怖。下面我們來(lái)看下C++ primer當(dāng)中提供的一些例子:

const double* f1(const double ar[], int n);
const double* f2(const double [], int);
const double* f3(const double *, int);

這三個(gè)函數(shù)看起來(lái)長(zhǎng)得不一樣,但其實(shí)是等價(jià)的。因?yàn)樵诤瘮?shù)參數(shù)列表當(dāng)中,數(shù)組和指針是等價(jià)的。其次我們可以在函數(shù)的原型中省略掉變量名,因此const double ar[]可以簡(jiǎn)化成const double [] ,也可以寫(xiě)成const double *。

有了這三個(gè)函數(shù)之后,假設(shè)我們要聲明一個(gè)指針,指向這三個(gè)函數(shù)。根據(jù)我們前文當(dāng)中說(shuō)過(guò)的,可以將函數(shù)名替換成(*pt)來(lái)實(shí)現(xiàn):

const double* (*pt)(const double *, int) = f1;

其實(shí)這個(gè)語(yǔ)句看起來(lái)就有些復(fù)雜了,整個(gè)語(yǔ)句的可讀性很差。如果不是知道這里用的是一個(gè)函數(shù)指針,乍一看想要看明白估計(jì)不太容易。我們可以分成兩個(gè)部分來(lái)理解,其中const double *是一個(gè)整體,表示函數(shù)的返回值類(lèi)型是一個(gè)const double *也就是一個(gè)常量浮點(diǎn)數(shù)的地址。其次(*pt)是一個(gè)整體,代替了函數(shù)名,表示這是一個(gè)指向函數(shù)的指針。

在C++11當(dāng)中提供了叫做auto的新特性,它可以幫助變量自動(dòng)識(shí)別對(duì)應(yīng)的類(lèi)型,可以解決一些類(lèi)型特別復(fù)雜的問(wèn)題,比如:

auto p2 = f2;

函數(shù)指針有兩種調(diào)用方法,除了可以使用(*p2)的方式調(diào)用之外,

也可以直接使用名稱(chēng)調(diào)用:

const double* x = p2(ar, 3);
const double* y = (*p2)(ar, 3);

顯然前者更好,更清楚。這里其實(shí)有一個(gè)疑問(wèn),為什么這兩種方式都可以執(zhí)行呢?這是因?yàn)楫?dāng)我們執(zhí)行auto p2 = f2的時(shí)候,其實(shí)是執(zhí)行的auto p2 = &f2 ,C++會(huì)隱式地將函數(shù)轉(zhuǎn)換成函數(shù)的地址。因?yàn)楹瘮?shù)的值本身就是一個(gè)地址,所以這兩種方式才都能正確地運(yùn)行。

問(wèn)題還沒(méi)有結(jié)束,假如我們要定義一個(gè)指向函數(shù)的指針數(shù)組呢?這應(yīng)該怎么聲明?

也就是const double* (*pt)(const double *, int)這樣一個(gè)類(lèi)型的數(shù)組,它應(yīng)該怎么聲明,這個(gè)方括號(hào)應(yīng)該放在那里?

正確答案是放在括號(hào)里:

const double* (*pt[3])(const double *, int);

因?yàn)檫\(yùn)算符[]的優(yōu)先級(jí)高于*,因此*pt[3]表示pt是一個(gè)長(zhǎng)度為3的指針數(shù)組。其他的內(nèi)容表明了該指針的類(lèi)型。

由于我們定義的是一個(gè)數(shù)組,所以這里不能使用auto,因?yàn)樽詣?dòng)類(lèi)型推斷只能用于單值初始化而不能用于初始化列表。

到這里還沒(méi)結(jié)束,還有更恐怖的,如果我們想要定義一個(gè)指向這個(gè)數(shù)組的指針,應(yīng)該怎么辦呢?如果使用auto可以寫(xiě)成:

auto ptr = &pt;

如果不使用auto呢?首先我們可以想到,這個(gè)聲明是基于pt的,我們需要在pt的聲明上加上一個(gè)*,但問(wèn)題是加在哪里呢?

進(jìn)一步分析,會(huì)發(fā)現(xiàn)我們需要指出這是一個(gè)指針,而不是數(shù)組。意味著核心的部分應(yīng)該寫(xiě)成(*ptr)[3],表示這是一個(gè)指向長(zhǎng)度為3的數(shù)組的指針。因?yàn)閇]的優(yōu)先級(jí)更高,所以需要使用括號(hào)。如果寫(xiě)成*ptr[3]表示這是長(zhǎng)度為3的指針數(shù)組。

我們進(jìn)一步倒推,(*ptr)[3]這個(gè)數(shù)組當(dāng)中的元素是什么類(lèi)型呢?是指向函數(shù)的指針,所以寫(xiě)出來(lái)結(jié)果是這樣:

const double *(*(*ptr)[3])(const double*, int) = &pt;

很明顯,這樣的定義非常非常的難以理解。而且這還不是最復(fù)雜的情況,比如函數(shù)的返回類(lèi)型又是一個(gè)指向一個(gè)函數(shù)的指針……明擺著告訴我們含義我們?nèi)匀灰魄靡粫?huì),如果在一段不明的代碼當(dāng)中遇到,可能會(huì)直接抓狂吧……

也正因此,C++11當(dāng)中推出了auto特性,可以簡(jiǎn)化這種情況。

多說(shuō)一句題外話(huà),golang語(yǔ)言當(dāng)中將變量的類(lèi)型放在變量的后面而不是前面,其中一個(gè)原因就是為了解決類(lèi)似情況的復(fù)雜性。

如果是golang來(lái)定義同樣的內(nèi)容,會(huì)是這樣的:

func f2(arr []float64, n int) *float64 {
    // todo
}

// 函數(shù)指針
var p1 func([]float64, int) *float64 = f2;
// 函數(shù)指針數(shù)組
var pt [3]func([]float64, int) *float64;
// 函數(shù)指針數(shù)組的指針
var ptr *[3]func([]float64, int) *float64 = &pt;

很明顯,雖然變量類(lèi)型寫(xiě)在變量后面剛開(kāi)始會(huì)不太習(xí)慣,但是很明顯這樣要清晰很多。

到此這篇關(guān)于C++ 函數(shù)指針內(nèi)容總結(jié)的文章就介紹到這了,更多相關(guān)C++ 函數(shù)指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

文章轉(zhuǎn)自公眾號(hào):Coder梁(ID:Coder_LT)

相關(guān)文章

  • C語(yǔ)言詳細(xì)分析講解內(nèi)存管理malloc realloc free calloc函數(shù)的使用

    C語(yǔ)言詳細(xì)分析講解內(nèi)存管理malloc realloc free calloc函數(shù)的使用

    C語(yǔ)言?xún)?nèi)存管理相關(guān)的函數(shù)主要有realloc、calloc、malloc、free等,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言?xún)?nèi)存管理realloc、calloc、malloc、free函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • 關(guān)于C++地址交換的實(shí)現(xiàn)

    關(guān)于C++地址交換的實(shí)現(xiàn)

    在C++中,地址交換通常是指通過(guò)指針操作改變兩個(gè)變量之間的內(nèi)存地址引用,當(dāng)你有兩個(gè)指針?lè)謩e指向兩個(gè)變量時(shí),你可以通過(guò)某種機(jī)制交換這兩個(gè)指針的內(nèi)容,使得它們各自指向?qū)Ψ皆瓉?lái)的位置,本介紹了關(guān)于C++地址交換的實(shí)現(xiàn),需要的朋友可以參考下
    2024-11-11
  • C++構(gòu)造函數(shù)初始化順序詳解

    C++構(gòu)造函數(shù)初始化順序詳解

    這篇文章主要介紹了C++構(gòu)造函數(shù)初始化順序詳解,是對(duì)C++代碼的運(yùn)行機(jī)制深入探討,需要的朋友可以參考下
    2014-10-10
  • C/C++動(dòng)態(tài)分配與釋放內(nèi)存的區(qū)別詳細(xì)解析

    C/C++動(dòng)態(tài)分配與釋放內(nèi)存的區(qū)別詳細(xì)解析

    以下是對(duì)C與C++中動(dòng)態(tài)分配與釋放內(nèi)存的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • C++中constexpr與模板元編程的基礎(chǔ)、常見(jiàn)問(wèn)題、易錯(cuò)點(diǎn)及其規(guī)避策略

    C++中constexpr與模板元編程的基礎(chǔ)、常見(jiàn)問(wèn)題、易錯(cuò)點(diǎn)及其規(guī)避策略

    C++編譯時(shí)計(jì)算允許程序在編譯階段完成計(jì)算任務(wù),constexpr與模板元編程是C編譯時(shí)計(jì)算的兩把利劍,它們不僅能夠提升程序的性能,還能增強(qiáng)代碼的健壯性和可維護(hù)性,通過(guò)避開(kāi)本文闡述的易錯(cuò)點(diǎn),開(kāi)發(fā)者可以更加得心應(yīng)手地運(yùn)用這些特性,編寫(xiě)出既高效又優(yōu)雅的C代碼
    2024-06-06
  • 解析C++中臨時(shí)對(duì)象的產(chǎn)生情況

    解析C++中臨時(shí)對(duì)象的產(chǎn)生情況

    臨時(shí)對(duì)象的產(chǎn)生和銷(xiāo)毀都是有成本的,都會(huì)影響程序的執(zhí)行性能和效率,所以如果能了解臨時(shí)對(duì)象產(chǎn)生的原因,就可以提升程序的性能和效率,下面小編就來(lái)和大家聊聊臨時(shí)對(duì)象產(chǎn)生的幾種情況吧
    2023-06-06
  • C語(yǔ)言 scanf輸入多個(gè)數(shù)字只能以逗號(hào)分隔的操作

    C語(yǔ)言 scanf輸入多個(gè)數(shù)字只能以逗號(hào)分隔的操作

    這篇文章主要介紹了C語(yǔ)言 scanf輸入多個(gè)數(shù)字只能以逗號(hào)分隔的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • c++實(shí)現(xiàn)高精度加法

    c++實(shí)現(xiàn)高精度加法

    高精度運(yùn)算是指參與運(yùn)算的數(shù)(加數(shù),減數(shù),因子……)范圍大大超出了標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型(整型,實(shí)型)能表示的范圍的運(yùn)算。例如,求兩個(gè)200位的數(shù)的和。這時(shí),就要用到高精度算法了。
    2017-05-05
  • C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理程序

    C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理程序

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 深入分析C++中聲明與定義的區(qū)別

    深入分析C++中聲明與定義的區(qū)別

    C++學(xué)了這么多年你知道為什么定義類(lèi)時(shí),類(lèi)的定義放在.h文件中,而類(lèi)的實(shí)現(xiàn)放在cpp文件中。它們?yōu)槭裁茨軌蜿P(guān)聯(lián)到一起呢?你知道什么東西可以放在.h文件中,什么不能。什么東西又可以放在cpp文件中。如果你忘記了或是壓根就不明白,那么讀過(guò)此文你會(huì)清晰無(wú)比?。?/div> 2014-09-09

最新評(píng)論