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 函數指針需要注意的幾個問題

指向函數的指針,定義的時候為了保證類型一致,少犯錯誤。可以把函數定義的頭部搬到定義的地方,在后面加上分號,把原來的函數名換為合法的標示符。如有函數: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.

主站蜘蛛池模板: www.精品国产| 欧美特级AAAAAA视频免费观看| 欧美亚洲一二三区| 欧美日韩精品一区二区在线线| 91免费国产高清观看| 亚洲精品午夜天堂网页| 亚洲第一在线播放| 亚洲午夜天堂| 国产自视频| 国产一区亚洲一区| 四虎精品国产AV二区| 亚洲综合色区在线播放2019| 99久久国产自偷自偷免费一区| 91在线激情在线观看| 极品国产在线| 啪啪永久免费av| 亚洲精品777| 精品无码一区二区在线观看| 中国一级毛片免费观看| 国产欧美亚洲精品第3页在线| 中文字幕亚洲综久久2021| 亚洲狠狠婷婷综合久久久久| 99久久精品国产自免费| 特级欧美视频aaaaaa| 老司机精品久久| 国产精品午夜福利麻豆| 国产精品久久久久鬼色| 亚洲精品桃花岛av在线| 刘亦菲一区二区在线观看| 国产网友愉拍精品视频| 欧美中出一区二区| 99re这里只有国产中文精品国产精品 | 午夜啪啪网| 无码国内精品人妻少妇蜜桃视频| 亚洲综合第一页| 99精品热视频这里只有精品7| 亚洲成人精品久久| 亚洲va视频| 亚洲中文字幕国产av| 欧美亚洲激情| 欧洲精品视频在线观看| 欧美亚洲激情| 大香网伊人久久综合网2020| 又黄又湿又爽的视频| 国产日韩欧美成人| 欧美日韩资源| 国产精品亚洲精品爽爽| 永久在线精品免费视频观看| 99热这里只有精品5| 亚洲精品自在线拍| 欧美亚洲国产精品久久蜜芽| 中文字幕无码电影| 久久久久亚洲AV成人网站软件| 日本一区二区三区精品视频| 欧美 亚洲 日韩 国产| 国产激情无码一区二区免费| 欧美一区二区自偷自拍视频| 国产精品一区二区国产主播| 国产女人18水真多毛片18精品| 谁有在线观看日韩亚洲最新视频| 久久久久久尹人网香蕉 | 中文国产成人久久精品小说| 久久久久久久久亚洲精品| 国产精品一区不卡| 亚洲欧洲日韩久久狠狠爱 | 久久精品国产电影| 国产真实乱了在线播放| 国产精品一线天| 日本a∨在线观看| 黄色网址免费在线| 亚洲欧州色色免费AV| 一本大道视频精品人妻| 五月激情婷婷综合| 日韩人妻无码制服丝袜视频| 亚洲成a人片77777在线播放| 中文毛片无遮挡播放免费| 免费观看无遮挡www的小视频| 国产美女一级毛片| 国产成a人片在线播放| 成人国产小视频| 日韩av资源在线| 欧美日韩精品一区二区在线线|