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

c++函數(shù)名指針和函數(shù)指針

 更新時間:2022年02月11日 10:54:04   作者:wei2023  
這篇文章主要介紹了c++函數(shù)名指針和函數(shù)指針,函數(shù)指針和數(shù)據(jù)類似,C++當(dāng)中函數(shù)也有地址,函數(shù)的地址是存儲函數(shù)機(jī)器語言代碼的內(nèi)存地址。我們可以將另外一個函數(shù)的地址作為參數(shù)傳入函數(shù),從而實現(xiàn)函數(shù)的靈活調(diào)用,下面詳細(xì)內(nèi)容需要的小伙伴可以參考一下

前言

我們先來看一下函數(shù)指針式如何定義的,假如我們有一個函數(shù)int fun(int){…};那么他對應(yīng)的函數(shù)指針寫法就應(yīng)該是int (*p)(int);然后再對他進(jìn)行賦值,即p=fun;之后你就可以在接下來的地方按p作為函數(shù)名來調(diào)用它用起來完全和fun一樣。(注意這里的p指針并不是只能接受fun這個函數(shù)名,任何返回值是int,參數(shù)只有一個int的函數(shù)都可以把函數(shù)名賦給p)

首先說一下C/C++在創(chuàng)建一個變量的時候比如int a;相應(yīng)的在內(nèi)存就會分配一個4個字節(jié)(根據(jù)不同機(jī)器可能不同)空間來存放這個int變量,而假設(shè)這4個字節(jié)的起始地址是0XFF0A,那么實際上就存在一種變量名和內(nèi)存地址的映射,即a可以看做是一個標(biāo)示符,他只是代表著0XFF0A這個地址,在程序中你對a進(jìn)行的操作實際上也就是對內(nèi)存中以0XFF0A為首地址的4個字節(jié)的操作,特別是如果對a進(jìn)行取地址操作也就是&a實際上就是返回0XFF0A這個地址值,實際上你可以看成就是返回一個指向這個地址的指針(如果你覺的不能理解,就當(dāng)我沒說吧).同理對于我們在程序中創(chuàng)建的函數(shù),他是保存在程序中的單獨區(qū)域的,而我們調(diào)用它們就像使用變量一樣需要一個地址來唯一的指向它,所以每個函數(shù)都需要一個地址來唯一標(biāo)識自己(也就是我們常說的入口地址),就像上面的a對應(yīng)0XFF0A,那么假設(shè)我們定義了一個int fun(int){};函數(shù)的入口地址是0XAAEE,則fun也就是函數(shù)名他會映射0XAAEE,和上面的int變量a一樣如果對它進(jìn)行取地址&fun的話就會返回0XAAEE,實際上fun也是一種類型,就當(dāng)它是函數(shù)名類型好了,只要記住函數(shù)名本身并不是一個指針類型就可以了。

在調(diào)用函數(shù)的時候有函數(shù)名就夠了,比如fun(2);不要以為只要有函數(shù)名就能調(diào)用函數(shù)了,其實這只是寫法上的一個迷惑點,而編譯器在編譯的時候一律都會進(jìn)行所謂的"Function-to-pointer conversion",也就是把函數(shù)名隱式轉(zhuǎn)換成函數(shù)指針類型,也就是要通過函數(shù)指針來調(diào)用函數(shù),所以如果你在調(diào)用函數(shù)的時候?qū)懗?&fun)(2)也是一樣能工作的,因為&fun實際上就是返回一個函數(shù)指針,參照上一段中&a的例子,只是這種寫法很不常見,即使你不顯式的寫出&的話編譯器也會隱式的進(jìn)行轉(zhuǎn)換,注意&fun左右的括號必須有,這是因為運(yùn)算符優(yōu)先級的問題。

其實即使寫成(fun)(2)也是可以正常運(yùn)行的,這是因為當(dāng)編譯器看到fun的時候發(fā)現(xiàn)它前面沒有&也就是沒有給他顯示的轉(zhuǎn)換成指針那么他就要隱式的轉(zhuǎn)換成指針,當(dāng)轉(zhuǎn)換完之后發(fā)現(xiàn)前面又有一個這時候也就是要進(jìn)行所謂的"解引用"操作,也就是到*后面里指針里取出來值,而那么值實際上也就也就是0XAAEE也就是函數(shù)名fun,這么一次隱式換然后再來一次解引用實際上相當(dāng)于什么也沒做,所以系統(tǒng)還會再進(jìn)行一次隱式的"Function-to-pointer conversion",即使你寫成(*******fun)(2)也會正常運(yùn)行,和剛才的一個道理,只是多做了幾次反復(fù)的轉(zhuǎn)解操作而已,都是編譯器自己完成的,不必去理會!

例 1

#include<iostream>
using namespace std;
void fun(int a)
{

}

int main()
{
? ? cout<<fun<<endl;
? ? cout<<*fun<<endl;
? ? cout<<&fun<<endl;
? ? cout<<*****fun<<endl;
}

結(jié)果輸出的值都是一樣的,也就是都是指向同一個函數(shù)地址的指針值。

例 2

下面再結(jié)合自己定義的函數(shù)指針來看看:

#include<iostream>
using namespace std;
int fun(int a)
{
? ? cout<<"fun"<<endl;
? ? return 0;
}

void main()
{
? ? int(*p)(int)=fun;
? ? int(*p1)(int)=*fun;
? ? int(*p2)(int)=&fun;
? ? p(1);
? ? p1(1);
? ? p2(1);
}

例 3

發(fā)現(xiàn)函數(shù)都能正常的運(yùn)行,其實p1,p2,p和fun賦值之后大家一樣理解就行了。

代碼:

#include<iostream>
using namespace std;
int fun(int a)
{
? ? cout<<"fun"<<endl;
? ? return 0;
}
?
void main()
{
? ? int(*p)(int)=fun;
? ? p(1);
// ?(&p)(1); ??
? ? (*p)(1);
? ? (****p)(1);
}

上面的程序也都會正常的運(yùn)行,只要再理解的時候把p當(dāng)成只是對函數(shù)名多做了一次轉(zhuǎn)換就可以了,接下來理解都一樣!注意上面注釋掉的哪一行是不能運(yùn)行的,因為p是我們自己定義的函數(shù)指針類型,如果你對指針取地址那么將得到p這個變量本身的地址,這就不能正確調(diào)用函數(shù)了!再多說一句,其實你如果運(yùn)行&&fun這個式子也是非法的,至于為什么,大家一起幫我思考思考,我個人認(rèn)為當(dāng)我們運(yùn)行&fun的時候他會轉(zhuǎn)換成函數(shù)指針而實際上這個指針只是一個臨時值而臨時值是沒有實際存放的內(nèi)存地址的所以也就無法繼續(xù)取地址了!

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

相關(guān)文章

  • 一篇文章帶你使用C語言編寫內(nèi)核

    一篇文章帶你使用C語言編寫內(nèi)核

    內(nèi)核是操作系統(tǒng)最核心的內(nèi)容,主要提供硬件抽象層、磁盤及文件系統(tǒng)控制、多任務(wù)等功能,由于其涉及非常廣泛的計算機(jī)知識,很少被人們所熟悉,因而披上了一層神秘的面紗
    2021-08-08
  • Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫運(yùn)行C、C++的教程詳解(主要Windows、簡要Linux)

    Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫運(yùn)行C、C++的教程詳解(主要Windo

    這篇文章主要介紹了Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫運(yùn)行C、C++(主要Windows、簡要Linux),本文通過實例截圖給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Qt實現(xiàn)模糊匹配功能的實例詳解

    Qt實現(xiàn)模糊匹配功能的實例詳解

    對于瀏覽器的使用,我想大家一定不會陌生吧,輸入要搜索的內(nèi)容時,會出現(xiàn)相應(yīng)的匹配信息。本文就來用Qt實現(xiàn)模糊匹配功能,感興趣的可以了解一下
    2022-10-10
  • C++利用靜態(tài)成員或類模板構(gòu)建鏈表的方法講解

    C++利用靜態(tài)成員或類模板構(gòu)建鏈表的方法講解

    這篇文章主要介紹了C++利用靜態(tài)成員或類模板構(gòu)建鏈表的方法講解,鏈表是基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),而在C++中構(gòu)件單鏈表還是稍顯復(fù)雜,需要的朋友可以參考下
    2016-04-04
  • 深入理解C語言中編譯相關(guān)的常見錯誤

    深入理解C語言中編譯相關(guān)的常見錯誤

    本篇文章是對C語言中編譯相關(guān)的常見錯誤進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言中atoi函數(shù)模擬實現(xiàn)詳析

    C語言中atoi函數(shù)模擬實現(xiàn)詳析

    atoi函數(shù)功能是將數(shù)字字符串轉(zhuǎn)換為整數(shù),比如數(shù)字字符串"12345"被atoi轉(zhuǎn)換為12345,數(shù)字字符串"-12345"被轉(zhuǎn)換為-12345,下面這篇文章主要給大家介紹了關(guān)于C語言中atoi函數(shù)模擬實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • C++常用的11種設(shè)計模式解釋及示例代碼詳解

    C++常用的11種設(shè)計模式解釋及示例代碼詳解

    c++常用的設(shè)計模式包括單例模式、工廠模式、抽象工廠模式、適配器模式、裝飾者模式、代理模式、外觀模式、橋接模式、組合模式、享元模式、觀察者模式和命令模式等,這篇文章主要介紹了C++常用的11種設(shè)計模式解釋及示例,需要的朋友可以參考下
    2023-02-02
  • C++ 超詳細(xì)快速掌握二叉搜索樹

    C++ 超詳細(xì)快速掌握二叉搜索樹

    從這篇博客開始,我就要和大家介紹有關(guān)二叉搜索樹的知識,它還衍生出了兩棵樹——AVL樹和紅黑樹,在后面兩篇博客我都會介紹。今天先從二叉搜索樹開始引入
    2022-03-03
  • 詳細(xì)聊聊c語言中的緩沖區(qū)問題

    詳細(xì)聊聊c語言中的緩沖區(qū)問題

    緩沖區(qū)又稱為緩存,它是內(nèi)存空間的一部分,也就是說在內(nèi)存空間中預(yù)留了一定的存儲空間,這些存儲空間用來緩沖輸入或輸出的數(shù)據(jù),這部分預(yù)留的空間就叫做緩沖區(qū),這篇文章主要給大家介紹了關(guān)于c語言中緩沖區(qū)問題的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • C++詳細(xì)講解IO流原理

    C++詳細(xì)講解IO流原理

    當(dāng)程序與外界進(jìn)行信息交換時,存在兩個對象,一個是程序中的對象,另一個是文件對象。流是信息流動的一種抽象,它負(fù)責(zé)在數(shù)據(jù)的生產(chǎn)者和數(shù)據(jù)的消費(fèi)者之間建立聯(lián)系,并管理數(shù)據(jù)的流動
    2022-05-05

最新評論