999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

一個難于理解的C++函數指針問題

2014-01-15 01:18:40王玉山
山東工業技術 2014年20期

王玉山

(廣東外語外貿大學,廣州 510440)

一個難于理解的C++函數指針問題

王玉山

(廣東外語外貿大學,廣州 510440)

摘要:指針是C、C++程序設計語言中一個比較復雜、難于掌握的概念。但又是任何一個C、C++程序設計者必須過的一道門檻。本文只就其中比較難難于理解的函數指針的一個例子加以闡述。希望對于C、C++程序設初學者有所幫助。

關鍵詞:C++程序設計;C++函數指針;

1 什么是指針

指針常量與指針變量統稱為指針。有關變量(類對象)、數組、函數、字符串常量的地址值都是地址常量,它們不能被賦值,只能做右值;可以被賦值的地址變量是指針變量,它們可以做左值也可以作右值。

2 函數指針

函數名是函數代碼段的入口地址,是地址常量,只能做右值;指向函數的指針變量是用來存放函數的入口地址的,可以做左值也可以做右值。

3 函數指針變量的類型與賦值的要求

象普通變量賦值一樣,函數指針變量的賦值要求右值和左值必須類型一致。什么是函數指針的類型呢?就是在定義函數指針時,我們把指針名去掉,剩下的部分就是函數指針的類型。

4 一個難于理解的函數指針的例子

int (*return_fun(char op))(int, int){……}。去掉return_fun(char op)后留下部分為:int (*)(int, int),即為函數return_fun(char op)返回的類型,是一個返回值為整形,有2個整形參數的函數。它的形參是字符變量char op。

#include <iostream>

using namespace std;

int add(int a, int b)

{

return a + b;}

int sub(int a,int b)

{

return a-b;

}

int mul(int a, int b)

{

return a * b;

}

int div(int a, int b)

{

return b?a/b:-1;

}

下面定義的return_fun(char op),即為返回指向函數的指針函數,該函數參數是char op。

int (*return_fun(char op))(int, int)

{

switch (op)

{

case '+':return add;//返回函數的地址,即函數名。

case '-':return sub;

case '*':return mul;

case '/':return div;

default:

return NULL;

}

}

//s_fp為指向函數的指針變量,指向有2個整形參數,返回值為整形的函數。 這里指向函數的指針變量 s_fp的右值是:return_ fun(op),return_fun(op)是一個函數調用、返回一個函數指針常量,即四個函數名add、sub、mul、div之一。

//下面的語句根據上一步得到的函數的地址調用相應函數,并返回運算結果。

if (s_fp)return s_fp(a, b);

else return -1;

}

int main(int argc, char** argv){

int a = 800, b = 200;

cout<<a<<"+"<<b<<"="<<calc(a,'+', b )<<endl;

cout<<a<<"-"<<b<<"="<<calc(a, '-', b)<<endl;

cout<<a<<"*"<<b<<"="<<calc(a, '*',b)<<endl;

cout<<a<<"/"<<b<<"="<<calc(a,'/', b )<<endl;

return 0;

}

以上程序在DevC++5.4.2版本下通過試驗。

5 函數指針需要注意的幾個問題

指向函數的指針,定義的時候為了保證類型一致,少犯錯誤??梢园押瘮刀x的頭部搬到定義的地方,在后面加上分號,把原來的函數名換為合法的標示符。如有函數:int add(int a, int b){return a + b;}。我們就把這個函數頭部的函數名用Psum代替、省掉參數名、將標示符左側加*號,必須將*號與標示符加括號進行綁定得到:int (* Psum )(int , int);此時Psum就是可以指向int add(int a, int b){return a + b;}函數的指針變量了。注意這個用于綁定的括號絕對不能省掉,如果省掉Psum就不是變量了!成了這樣:int * Psum (int , int);這就成了返回整形指針的函數原形聲明了。Psum也成了常量。

象普通變量一樣,指向函數的指針變量也必須先定義后使用。

前面函數頭部為:int (*return_fun(char op))(int, int)的例子中,是一個比較復雜的應用,該代碼段定義的函數為return_fun(char op),而函數return_fun(char op))的返回類型是int (*return_fun(char op))(int,int)中把return_fun(char op)去掉后留下的部分:int (*)(int, int),這是一個指向函數的指針類型。在本例中最右側的括號(int, int)是絕對不能省掉的,因為它是確定return_fun(char op)返回類型的關鍵。

再看以下代碼段:void (*setF1(void (*f)()))(){……}。我們該如何理解?當然要從setF1為起點,右邊的括號有幾個,這看起來讓人有點頭暈。這里要特別注意圓括號的運算級別和結合性,我們知道圓括號的優先級是1級,左結合性。而這里的*號是間接訪問運算符,優先級是1級。所以應該先有setF1(void (*f)()),它是一個整體,setF1()的參數是void (*f)(),是一個指向函數的指針參數,在void (*setF1(void (*f)()))()中,把setF1(void (*f)())去掉后留下的部分是void (*)()就是函數setF1的返回類型。

參考文獻:

[1]王珊珊等著.C++程序設計教程(第2版),北京:機械工業出版社,2011年1月第 2 版,ISBN978-7-111-33022-6.

[2]譚浩強著.C程序設計,第三版,北京, 清華大學出版社,2005年 7月第3 版,ISBN 7-302-10853- 6/TP·7217.

[3]史上最牛逼的 C++指針 http://wenku.baidu.com/link?url=Mw5lETdR_tZo2-6zbkNmj7pZPb7OiiYPzwrvO0epmv6SAX14UFJ Yq9u3xt5gPwOlM8u1ZKlscq2U-SfUk6GshQooN59vaVJxJAo8YxLDWuy.

主站蜘蛛池模板: 天天爽免费视频| 天天操天天噜| 亚洲人成网站在线观看播放不卡| 91色国产在线| 亚洲综合久久成人AV| 一本色道久久88亚洲综合| 久久无码高潮喷水| 91无码人妻精品一区| 操美女免费网站| 毛片在线看网站| 2020精品极品国产色在线观看| 四虎AV麻豆| 国产成人综合网| 91成人免费观看在线观看| 精品视频免费在线| 国产美女无遮挡免费视频网站 | 国语少妇高潮| 人妻出轨无码中文一区二区| 亚洲男人的天堂网| 国产欧美性爱网| 久久久久国产一级毛片高清板| a色毛片免费视频| 欧美区一区二区三| 欧美日韩在线第一页| 日本国产一区在线观看| 国产一级毛片yw| 国产91导航| 国产麻豆精品在线观看| 久久99热66这里只有精品一| 国产在线视频自拍| 国产经典免费播放视频| 91亚洲免费| 国产视频只有无码精品| 欧美成人精品在线| 国内精品自在欧美一区| 久久一本精品久久久ー99| 精品久久久久无码| 国产在线小视频| 欧洲日本亚洲中文字幕| 欧美曰批视频免费播放免费| 88av在线| 亚洲精品制服丝袜二区| 国产产在线精品亚洲aavv| 黄色网站不卡无码| 国产精品一区二区久久精品无码| av一区二区三区高清久久| 国模视频一区二区| 免费在线成人网| 国产精品综合久久久| 欧美一级黄色影院| 国产91高跟丝袜| 伊人久久青草青青综合| 三上悠亚一区二区| 一级毛片在线直接观看| av在线人妻熟妇| 自慰高潮喷白浆在线观看| 六月婷婷激情综合| 国产欧美在线观看精品一区污| 日韩天堂在线观看| 亚洲国产欧美中日韩成人综合视频| 欧美精品二区| 男人天堂亚洲天堂| 91午夜福利在线观看| 欧美日本激情| 亚洲一区二区三区国产精华液| 第一区免费在线观看| 在线色综合| 免费国产黄线在线观看| 超级碰免费视频91| 国产后式a一视频| 中文字幕1区2区| 九九久久精品国产av片囯产区| 9999在线视频| 71pao成人国产永久免费视频| 女人av社区男人的天堂| 欧美综合成人| 高清视频一区| 亚欧成人无码AV在线播放| 试看120秒男女啪啪免费| 伊人久综合| 亚洲国产成人超福利久久精品| 色婷婷在线播放|