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.

主站蜘蛛池模板: 久久综合色视频| 91网在线| 成人在线第一页| 3344在线观看无码| 日本高清免费不卡视频| 亚洲精品片911| 国产成人久久777777| 精品1区2区3区| 国产亚洲高清在线精品99| 久久中文字幕不卡一二区| 在线观看国产网址你懂的| AV网站中文| 日韩第九页| 国产永久无码观看在线| 青草视频久久| 40岁成熟女人牲交片免费| 国产丝袜第一页| 亚洲嫩模喷白浆| 一级毛片在线播放免费观看| 国产av无码日韩av无码网站 | 国产精品香蕉在线观看不卡| 国产成人精品一区二区| 亚洲欧州色色免费AV| 女人av社区男人的天堂| 亚洲国产综合第一精品小说| 中文字幕无码制服中字| 精品视频免费在线| 成人精品在线观看| 亚洲精品自在线拍| a级毛片毛片免费观看久潮| 五月综合色婷婷| 婷五月综合| 成人91在线| 亚洲精品午夜天堂网页| 亚洲一区二区无码视频| 好吊色国产欧美日韩免费观看| 亚洲欧美另类中文字幕| 久久久亚洲色| av手机版在线播放| 亚洲天堂免费观看| 国产精品久久久久久久久| 欧美特黄一级大黄录像| 国产成人精品视频一区二区电影| 国产一区二区三区在线观看视频| 免费全部高H视频无码无遮掩| 精品国产香蕉伊思人在线| 台湾AV国片精品女同性| 青青草原国产免费av观看| 国产h视频免费观看| 欧美日韩精品一区二区在线线| 五月天综合网亚洲综合天堂网| 国产成人精品在线1区| 麻豆精品久久久久久久99蜜桃| 国产精品深爱在线| 国产日韩欧美精品区性色| 亚洲欧美日韩动漫| 久久亚洲欧美综合| 日韩免费中文字幕| 伊人激情久久综合中文字幕| 久久久久青草大香线综合精品| 国产精品女同一区三区五区| 小说 亚洲 无码 精品| 在线观看免费国产| 国产在线一区二区视频| 5555国产在线观看| 亚洲成A人V欧美综合| 岛国精品一区免费视频在线观看| 亚洲A∨无码精品午夜在线观看| 欧美精品不卡| 色婷婷国产精品视频| 国产第八页| 成人国产免费| 亚洲人成影院在线观看| 亚洲精品无码不卡在线播放| 国产精品刺激对白在线| 一本综合久久| 亚洲天堂在线免费| 色婷婷电影网| 婷五月综合| 无码福利视频| 欧美啪啪网| 国产午夜福利片在线观看|