亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

深入解析C語言中函數指針的定義與使用

2020-01-26 14:38:19
字體:
來源:轉載
供稿:網友

1.函數指針的定義  
  函數是由執行語句組成的指令序列或者代碼,這些代碼的有序集合根據其大小被分配到一定的內存空間中,這一片內存空間的起始地址就成為函數的地址,不同的函數有不同的函數地址,編譯器通過函數名來索引函數的入口地址,為了方便操作類型屬性相同的函數,c/c++引入了函數指針,函數指針就是指向代碼入口地址的指針,是指向函數的指針變量。 因而“函數指針”本身首先應該是指針變量,只不過該指針變量指向函數。這正如用指針變量可指向整形變量、字符型、數組一樣,這里是指向函數。C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變量后,可用該指針變量調用函數,就如同用指針變量可引用其他類型變量一樣,在這些概念上是一致的。函數指針有兩個用途:調用函數和做函數的參數。

函數指針的聲明方法為:

數據類型標志符 (指針變量名) (形參列表);

“函數類型”說明函數的返回類型,由于“()”的優先級高于“*”,所以指針變量名外的括號必不可少,后面的“形參列表”表示指針變量指向的函數所帶的參數列表。例如:

  int function(int x,int y); /* 聲明一個函數 */  int (*f) (int x,int y); /* 聲明一個函數指針 */  f=function; /* 將function函數的首地址賦給指針f */

  賦值時函數function不帶括號,也不帶參數,由于function代表函數的首地址,因此經過賦值以后,指針f就指向函數function(int x,int y);的代碼的首地址。

2.函數指針使用的例子 
知道了如何定義一個函數指針,但如何來使用它呢?先看如下例子:

#include <stdio.h>#include <string.h> char * fun(char * p1,char * p2){  int i = 0;  i = strcmp(p1,p2);   if (0 == i)  {    return p1;  }  else  {    return p2;  }} int main(){  char * (*pf)(char * p1,char * p2);  pf = &fun;  (*pf) ("aa","bb");  return 0;}

  我們使用指針的時候,需要通過鑰匙(“*”)來取其指向的內存里面的值,函數指針使用也如此。通過用(*pf)取出存在這個地址上的函數,然后調用它。

  這里需要注意到是,在Visual C++6.0里,給函數指針賦值時,可以用&fun或直接用函數名fun。這是因為函數名被編譯之后其實就是一個地址,所以這里兩種用法沒有本質的差別。這個例子很簡單,就不再詳細討論了。

3.*(int*)&p ----這是什么?

  也許上面的例子過于簡單,我們看看下面的例子:

void Function(){  printf("Call Function!/n");}<br>int main(){  void (*p)();  *(int*)&p=(int)Function;  (*p)();  return 0;} 

這是在干什么?*(int*)&p=(int)Function;表示什么意思?
別急,先看這行代碼:

void (*p)();

這行代碼定義了一個指針變量p,p指向一個函數,這個函數的參數和返回值都是void。
&p是求指針變量p本身的地址,這是一個32位的二進制常數(32位系統)。
(int*)&p表示將地址強制轉換成指向int類型數據的指針。
(int)Function表示將函數的入口地址強制轉換成int類型的數據。
分析到這里,相信你已經明白*(int*)&p=(int)Function;表示將函數的入口地址賦值給指針變量p。


那么(*p) ();就是表示對函數的調用。


講解到這里,相信你已經明白了。其實函數指針與普通指針沒什么差別,只是指向的內容不同而已。
使用函數指針的好處在于,可以將實現同一功能的多個模塊統一起來標識,這樣一來更容易后期的維護,系統結構更加清晰。或者歸納為:便于分層設計、利于系統抽象、降低耦合度以及使接口與實現分開。

4.(*(void(*) ())0)()------這是什么?

是不是感覺上面的例子太簡單,不夠刺激?好,那就來點刺激的,看下面這個例子:

(*(void(*) ())0)();

這是《C Traps and Pitfalls》這本經典的書中的一個例子。沒有發狂吧?下面我們就來分析分析:

第一步:void(*) (),可以明白這是一個函數指針類型。這個函數沒有參數,沒有返回值。
第二步:(void(*) ())0,這是將0強制轉換為函數指針類型,0是一個地址,也就是說一個函數存在首地址為0的一段區域內。
第三步:(*(void(*) ())0),這是取0地址開始的一段內存里面的內容,其內容就是保存在首地址為0的一段區域內的函數。
第四步:(*(void(*) ())0)(),這是函數調用。

好像還是很簡單是吧,上面的例子再改寫改寫:

(*(char**(*) (char **,char **))0) ( char **,char **);

如果沒有上面的分析,肯怕不容易把這個表達式看明白吧。不過現在應該是很簡單的一件事了。讀者以為呢?

5.函數指針數組

現在我們清楚表達式

char * (*pf)(char * p);

定義的是一個函數指針pf。既然pf是一個指針,那就可以儲存在一個數組里。把上式修改一下:

char * (*pf[3])(char * p);

這是定義一個函數指針數組。

它是一個數組,數組名為pf,數組內存儲了3個指向函數的指針。這些指針指向一些返回值類型為指向字符的指針、參數為一個指向字符的指針的函數。

這念起來似乎有點拗口。不過不要緊,關鍵是你明白這是一個指針數組,是數組。函數指針數組怎么使用呢?這里也給出一個非常簡單的例子,只要真正掌握了使用方法,再復雜的問題都可以應對。

如下:

#include <stdio.h>#include <string.h><br>char * fun1(char * p){  printf("%s/n",p);  return p;} char * fun2(char * p){  printf("%s/n",p);  return p;}char * fun3(char * p){  printf("%s/n",p);  return p;}<br>int main(){  char * (*pf[3])(char * p);  pf[0] = fun1; //可以直接用函數名  pf[1] = &fun2; //可以用函數名加上取地址符  pf[2] = &fun3;<br>  pf[0]("fun1");  pf[0]("fun2");  pf[0]("fun3");  return 0;} 

 

6.函數指針數組的指針


  看著這個標題沒發狂吧?函數指針就夠一般初學者折騰了,函數指針數組就更加麻煩,現在的函數指針數組指針就更難理解了。
其實,沒這么復雜。前面詳細討論過數組指針的問題,這里的函數指針數組指針不就是一個指針嘛。只不過這個指針指向一個數組,這個數組里面存的都是指向函數的指針。僅此而已。


下面就定義一個簡單的函數指針數組指針:

char * (*(*pf)[3])(char * p);

注意,這里的pf和上一節的pf就完全是兩碼事了。上一節的pf并非指針,而是一個數組名;這里的pf確實是實實在在的指針。這個指針指向一個包含了3個元素的數組;這個數字里面存的是指向函數的指針;這些指針指向一些返回值類型為指向字符的指針、參數為一個指向字符的指針的函數。

  這比上一節的函數指針數組更拗口。其實你不用管這么多,明白這是一個指針就ok了。其用法與前面講的數組指針沒有差別。下面列一個簡單的例子:

#include <stdio.h>#include <string.h> char * fun1(char * p){  printf("%s/n",p);  return p;} char * fun2(char * p){  printf("%s/n",p);  return p;} char * fun3(char * p){  printf("%s/n",p);  return p;} int main(){  char * (*a[3])(char * p);  char * (*(*pf)[3])(char * p);  pf = &a;   a[0] = fun1;  a[1] = &fun2;  a[2] = &fun3;   pf[0][0]("fun1");  pf[0][1]("fun2");  pf[0][2]("fun3");  return 0;}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人中文字幕| 亚洲护士老师的毛茸茸最新章节| 国产精品嫩草视频| 欧美成人免费观看| 欧美日韩亚洲成人| 色偷偷av一区二区三区乱| 国产精品久久久久国产a级| 亚洲a∨日韩av高清在线观看| 不卡av电影院| 国产精品久久久久久网站| 国产一区二区三区久久精品| 日韩久久精品成人| 黄色精品在线看| 亚洲国产欧美一区二区三区久久| 不卡伊人av在线播放| 日韩有码在线视频| 亚洲偷欧美偷国内偷| 亚洲精品www久久久| 亚洲美女福利视频网站| 久热99视频在线观看| 国产一区红桃视频| 91精品国产免费久久久久久| 日韩有码在线观看| 2021久久精品国产99国产精品| 国产亚洲精品久久久久动| 久久久亚洲国产天美传媒修理工| 成人妇女淫片aaaa视频| 国产精品∨欧美精品v日韩精品| 国产精品香蕉在线观看| 日韩a**站在线观看| 国产精品久久久久久久app| 成人国产精品久久久久久亚洲| 国产日韩欧美在线播放| 亚洲一品av免费观看| 日韩中文字幕精品视频| 国产精品视频中文字幕91| 亚洲xxx大片| 国产欧美在线播放| 九色精品免费永久在线| 亚洲一区中文字幕在线观看| 欧美最猛黑人xxxx黑人猛叫黄| 久久久久久久一| 69av在线视频| 亚洲欧美国产va在线影院| 国产视频在线观看一区二区| 综合国产在线视频| 国产91精品久久久久久| 久久九九有精品国产23| 国产精品三级网站| 欧美性猛交xxxx乱大交3| 日韩视频免费中文字幕| 精品国产一区久久久| 国外成人在线播放| 91影视免费在线观看| 精品中文字幕在线| 欧美性猛交xxxx乱大交极品| 亚洲精品一区中文字幕乱码| 亚洲高清色综合| 92看片淫黄大片看国产片| 亚洲天堂av在线免费| 欧美高清videos高潮hd| 国产成人jvid在线播放| 亚洲全黄一级网站| 国产亚洲精品久久久久久牛牛| 欧美高清在线播放| xxxxx91麻豆| 亚洲精品久久在线| 91精品久久久久久久久不口人| 日韩av成人在线| 欧美日韩国产精品一区二区三区四区| 日韩av观看网址| 色哟哟亚洲精品一区二区| 久久国产精彩视频| 97av在线视频免费播放| 日韩免费看的电影电视剧大全| 亚洲精品自拍偷拍| 亚洲综合日韩在线| 日本精品性网站在线观看| 欧美高清视频一区二区| 日韩视频欧美视频| 欧美性猛交xxxx免费看| 秋霞成人午夜鲁丝一区二区三区| 久久精品视频网站| 久久久91精品国产| 成人免费看吃奶视频网站| 韩国精品久久久999| 成人久久久久久| 欧洲永久精品大片ww免费漫画| 日韩高清免费观看| 久久久久久久国产精品视频| 成人亚洲欧美一区二区三区| 日韩在线观看免费全| 欧美理论电影在线播放| 最近的2019中文字幕免费一页| 国产精品爽黄69天堂a| 亚洲国产日韩欧美综合久久| 亚洲男人的天堂网站| 亚洲黄色在线观看| 久久精品国产一区| 亚洲男女自偷自拍图片另类| 日韩国产欧美精品一区二区三区| 亚洲欧美日韩爽爽影院| 久久久久国产一区二区三区| 亚洲国产福利在线| 国产视频久久久| 成人h视频在线观看播放| 91精品视频观看| 91亚洲精品在线观看| 午夜精品久久久久久久99黑人| 日韩va亚洲va欧洲va国产| 色诱女教师一区二区三区| 日韩精品久久久久久福利| 欧美精品电影在线| 成人网在线视频| 国产九九精品视频| 久久国产精品久久久久久| 国产精品一区=区| 国产激情综合五月久久| 亚洲风情亚aⅴ在线发布| 午夜精品福利在线观看| 久久久国产精品免费| 亚洲人成电影在线| 亚洲一区av在线播放| 久久成年人免费电影| 高清在线视频日韩欧美| 97在线视频一区| 91啪国产在线| 动漫精品一区二区| 亚洲精品中文字幕女同| 色偷偷综合社区| 日韩在线中文字幕| 亚洲福利视频网站| 国产精品看片资源| 欧美日韩高清区| 色婷婷久久av| 久久99久国产精品黄毛片入口| 在线视频欧美日韩精品| 国产精品久久久久久久久久东京| 日韩精品久久久久| 久久精品99久久久久久久久| 孩xxxx性bbbb欧美| 日韩av在线电影网| 国产视频在线一区二区| 国自产精品手机在线观看视频| 亚洲成人三级在线| 97在线观看视频国产| 久久亚洲成人精品| 日本电影亚洲天堂| 亚洲男人的天堂在线| 在线电影欧美日韩一区二区私密| 欧美国产乱视频| 97在线免费观看视频| 欧美精品在线第一页| 国产精品免费电影| 亚洲缚视频在线观看| 亚州精品天堂中文字幕| 69**夜色精品国产69乱| 国产日韩中文字幕在线| 91免费欧美精品| 久操成人在线视频| 伊人久久五月天| 欧美日韩国产成人高清视频| 久久久久久久久久久国产| 91手机视频在线观看|