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

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

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

1、函數(shù)指針

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

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

1.1 獲取函數(shù)地址

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

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

func(think);

1.2 聲明函數(shù)指針

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

double process(int);


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

double (*pt)(int);


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

1.3 函數(shù)指針傳參

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

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


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

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

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

其實也非常簡單,因為我們前面說了(*pt)的效果和函數(shù)是一樣的,我們之前通過函數(shù)名調(diào)用函數(shù),那么我們只需要改成通過(*pt)調(diào)用即可。

如:

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

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

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

簡單的函數(shù)指針比較簡單,但對于復雜的情況則顯得有些恐怖。下面我們來看下C++ primer當中提供的一些例子:

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

這三個函數(shù)看起來長得不一樣,但其實是等價的。因為在函數(shù)參數(shù)列表當中,數(shù)組和指針是等價的。其次我們可以在函數(shù)的原型中省略掉變量名,因此const double ar[]可以簡化成const double [] ,也可以寫成const double *。

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

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

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

在C++11當中提供了叫做auto的新特性,它可以幫助變量自動識別對應的類型,可以解決一些類型特別復雜的問題,比如:

auto p2 = f2;

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

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

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

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

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

也就是const double* (*pt)(const double *, int)這樣一個類型的數(shù)組,它應該怎么聲明,這個方括號應該放在那里?

正確答案是放在括號里:

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

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

由于我們定義的是一個數(shù)組,所以這里不能使用auto,因為自動類型推斷只能用于單值初始化而不能用于初始化列表。

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

auto ptr = &pt;

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

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

我們進一步倒推,(*ptr)[3]這個數(shù)組當中的元素是什么類型呢?是指向函數(shù)的指針,所以寫出來結(jié)果是這樣:

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

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

也正因此,C++11當中推出了auto特性,可以簡化這種情況。

多說一句題外話,golang語言當中將變量的類型放在變量的后面而不是前面,其中一個原因就是為了解決類似情況的復雜性。

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

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;

很明顯,雖然變量類型寫在變量后面剛開始會不太習慣,但是很明顯這樣要清晰很多。

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

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

相關(guān)文章

  • C++實現(xiàn)大整數(shù)乘法(字符串乘法)

    C++實現(xiàn)大整數(shù)乘法(字符串乘法)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)大整數(shù)乘法、字符串乘法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • c++中.dll與.lib文件的生成與使用的詳解

    c++中.dll與.lib文件的生成與使用的詳解

    本篇文章介紹了,在c++中.dll與.lib文件的生成與使用的詳細介紹,需要的朋友參考下
    2013-05-05
  • C++實現(xiàn)將數(shù)組中的值反轉(zhuǎn)

    C++實現(xiàn)將數(shù)組中的值反轉(zhuǎn)

    這里給大家分享的事一則C++實現(xiàn)將數(shù)組中的值反轉(zhuǎn)的代碼,取材自《C++程序設(shè)計》(梁勇著第三版367頁),有需要的小伙伴可以參考下
    2016-05-05
  • 最新評論

    十堰市| 桦川县| 滨海县| 扎兰屯市| 建水县| 东港市| 武宁县| 古田县| 鄱阳县| 吉安市| 金华市| 鹤岗市| 霞浦县| 内黄县| 延长县| 江北区| 安西县| 兴义市| 隆回县| 上思县| 砚山县| 沙湾县| 贡觉县| 曲靖市| 颍上县| 阜新市| 湾仔区| 武强县| 武汉市| 陇西县| 黑山县| 田林县| 常山县| 张家界市| 石阡县| 长春市| 宜昌市| 夏邑县| 新干县| 眉山市| 惠水县|