精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C語言的那些小秘密之函數指針

開發 后端
我們經常會聽到這樣的說法,不懂得函數指針就不是真正的C語言高手。我們不管這句話對與否,但是它都從側面反應出了函數指針的重要性,所以我們還是有必要掌握對函數指針的使用。先來看看函數指針的定義吧。

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

[[128816]]

函數指針的聲明方法為:

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

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

  1. int function(int x,int y); /* 聲明一個函數 */ 
  2. int (*f) (int x,int y); /* 聲明一個函數指針 */ 

f=function; /* 將function函數的首地址賦給指針f */

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

下面的程序說明了函數指針調用函數的方法:

例一、

 

  1. #include 
  2.  
  3. int max ( int x, int y){ return x>y?x:y;} 
  4.  
  5. int min ( int x, int y){ return x 
  6.  
  7. void main 
  8.  
  9. int ( *f ) ( int x, int y)=max; 
  10.  
  11. //f=&max; 
  12.  
  13. printf ( "%d,%d\t", max (2,6), (f)(5,4)); 
  14.  
  15. f=min; 
  16.  
  17. printf (" %d,%d\t" , min (2,6), (f)(5,4)); 
  18.  

 

注意:以上代碼的紅色部分我們將會在接下來的代碼分析部分進行講解,讀者也可以思考下如果運行注釋部分,結果是否還是正確的呢?

f是指向函數的指針變量,所以可把函數max賦給f作為f的值,即把max的入口地址賦給f,以后就可以用f來調用該函數,實際上f和max都指向同一個入口地址,不同就是f是一個指針變量,不像函數名稱那樣是死的,它可以指向任何函數,就看你想怎么做了。在程序中把哪個函數的地址賦給它,它就指向哪個函數。而后用指針變量調用它,因此可以先后指向不同的函數。不過注意,指向函數的指針變量沒有++和--運算,用時要小心。

函數括號中的形參可有可無,視情況而定,不過,在某些編譯器中這是不能通過的。這個例子的補充如下。

1.定義函數指針類型:

  1. typedef int (*fun_ptr)(int,int); 

2.申明變量,賦值:

  1. fun_ptr max_func=max; 

也就是說,賦給函數指針的函數應該和函數指針所指的函數原型是一致的。

例二、

 

  1. #include 
  2.  
  3. void FileFunc 
  4.  
  5.  
  6. printf("FileFunc\n"); 
  7.  
  8.  
  9. void EditFunc 
  10.  
  11.  
  12. printf("EditFunc\n"); 
  13.  
  14.  
  15. void main 
  16.  
  17.  
  18. typedef void (*funcp); 
  19.  
  20. funcp pfun= FileFunc; 
  21.  
  22. pfun; 
  23.  
  24. pfun = EditFunc; 
  25.  
  26. pfun; 
  27.  

看了上面兩段代碼,應該都知道如何用函數指針來調用函數了,但是我們剛剛在上面的描述中留下過一個問題,就是運行注釋部分f=&max;結果是否還是正確的呢?下面我就給出上面兩個運行結果的對別,然后來分析下原因。

C語言的那些小秘密之函數指針

 

把注釋部分加進去的運行結果為:

C語言的那些小秘密之函數指針

 

對比以上的運行結果可以看出,f=&max語句被執行時的結果和沒有被執行時的結果是一樣的。為什么會出現這樣的結果呢?答案是這是編譯器處理的,max本身就是個地址,它沒有放到任何變量里,自然沒有取它的地址一說。所以我們可以看看在調試的過程中&max的值和max的值是一樣的。調試代碼如下:

 

  1. root@ubuntu:/home/shiyan# gdb ss 
  2.  
  3. GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2 
  4.  
  5. Copyright (C) 2010 Free Software Foundation, Inc. 
  6.  
  7. License GPLv3+: GNU GPL version 3 or later 
  8.  
  9. This is free software: you are free to change and redistribute it. 
  10.  
  11. There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
  12.  
  13. and "show warranty" for details. 
  14.  
  15. This GDB was configured as "i686-linux-gnu"
  16.  
  17. For bug reporting instructions, please see: 
  18.  
  19. ... 
  20.  
  21. Reading symbols from /home/shiyan/ss...done. 
  22.  
  23. (gdb) list 
  24.  
  25. 1 #include 
  26.  
  27. 2 int max ( int x, int y){ return x>y?x:y;} 
  28.  
  29. 3 int min ( int x, int y){ return x 
  30.  
  31. 4 void main 
  32.  
  33. 5 { int ( *f ) ( int x, int y)=max; 
  34.  
  35. 6 //f=&max; 
  36.  
  37. 7 printf ( "%d,%d\t", max (2,6), (f)(5,4)); 
  38.  
  39. 8 f=min; 
  40.  
  41. 9 printf (" %d,%d\t" , min (2,6), (f)(5,4)); 
  42.  
  43. 10 } 
  44.  
  45. (gdb) b 4 
  46.  
  47. Breakpoint 1 at 0x80483ec: file hanshu.c, line 4
  48.  
  49. (gdb) r 
  50.  
  51. Starting program: /home/shiyan/ss 
  52.  
  53. Breakpoint 1, main at hanshu.c:5 
  54.  
  55. (gdb) print max 
  56.  
  57. $1 = {int (intint)} 0x80483c4 
  58.  
  59. (gdb) print f 
  60.  
  61. $2 = (int (*)(intint)) 0xbffff6c8 
  62.  
  63. (gdb) s 
  64.  
  65. (gdb) 
  66.  
  67. max (x=5, y=4) at hanshu.c:2 
  68.  
  69. 2 int max ( int x, int y){ return x>y?x:y;} 
  70.  
  71. (gdb) print max 
  72.  
  73. $3 = {int (intint)} 0x80483c4 
  74.  
  75. (gdb) print &max 
  76.  
  77. $4 = (int (*)(intint)) 0x80483c4 
  78.  
  79. (gdb) print *max 
  80.  
  81. $5 = {int (intint)} 0x80483c4 
  82.  
  83. (gdb) s 
  84.  
  85. max (x=2, y=6) at hanshu.c:2 
  86.  
  87. (gdb) s 
  88.  
  89. main at hanshu.c:8 
  90.  
  91. 8 f=min; 
  92.  
  93. (gdb) print min 
  94.  
  95. $6 = {int (intint)} 0x80483d3 
  96.  
  97. (gdb) print &min 
  98.  
  99. $7 = (int (*)(intint)) 0x80483d3 
  100.  
  101. (gdb) print *min 
  102.  
  103. $8 = {int (intint)} 0x80483d3 
  104.  
  105. (gdb) s 
  106.  
  107. 9 printf (" %d,%d\t" , min (2,6), (f)(5,4)); 
  108.  
  109. (gdb) print f 
  110.  
  111. $9 = (int (*)(intint)) 0x80483d3 
  112.  
  113. (gdb) print &f 
  114.  
  115. $10 = (int (**)(intint)) 0xbffff6ac 
  116.  
  117. (gdb) print *f 
  118.  
  119. $11 = {int (intint)} 0x80483d3 
  120.  
  121. (gdb) s 
  122.  
  123. min (x=5, y=4) at hanshu.c:3 
  124.  
  125. 3 int min ( int x, int y){ return x 
  126.  
  127. (gdb) s 
  128.  
  129. min (x=2, y=6) at hanshu.c:3 
  130.  
  131. (gdb) print min 
  132.  
  133. $12 = {int (intint)} 0x80483d3 
  134.  
  135. (gdb) s 
  136.  
  137. main at hanshu.c:10 
  138.  
  139. 10 } 

在調試的過程中我print了很多的信息,細心的讀者肯定能獲得更多的收獲,尤其是對變量f的print,讀者可以自己閱讀,學到更多的東西。我給出的只是一個參考的調試方式,希望讀者能夠舉一反三,自己對代碼進行實際的調試,加深理解。

上面說的都是用指針來實現函數的調用,接下來我們看一個用函數指針作為參數的用法。

  1. #include 
  2.  
  3. using namespace std; 
  4.  
  5. typedef int (*print)(int ); 
  6.  
  7. int fun1(int i) 
  8.  
  9.  
  10. return (int)i; 
  11.  
  12.  
  13. void fun2(int j,print prt) 
  14.  
  15.  
  16. for(int k=0;k 
  17.  
  18. cout<<'\t'
  19.  
  20.  
  21. void main 
  22.  
  23.  
  24. int i=10; 
  25.  
  26. fun2(i,fun1); 
  27.  

運行結果如下:

 

 

看了上面的描述,我想都對函數指針的概念有了大致的了解,另外一個希望大家不要混淆的概念就是指針函數,,這兩個概念都是簡稱,指針函數是指帶指針的函數,即本質是一個函數。我們知道函數都又有返回類型(如果不返回值,則為無值型,即為void),只不過指針函數返回類型是某一類型的指針。

其定義格式如下所示:

返回類型標識符 *返回名稱(形式參數表)

{ 函數體}

返回類型可以是任何基本類型和復合類型。返回指針的函數的用途十分廣泛。事實上,每一個函數,即使它不帶有返回某種類型的指針,它本身都有一個入口地址,該地址相當于一個指針。比如函數返回一個整型值,實際上也相當于返回一個指針變量的值,不過這時的變量是函數本身而已,而整個函數相當于一個“變量”,關于函數的返回值問題我將在下一章來講解,本章到此為止。希望以上內容對你有所幫助!

C語言博大精深,由于本人水平有限,博客中的不妥或錯誤之處在所難免,殷切希望讀者批評指正。同時也歡迎讀者共同探討相關的內容,如果樂意交流的話請留下你寶貴的意見。

責任編輯:王雪燕 來源: 電子產品世界
相關推薦

2015-04-14 09:46:09

Apple Watch秘密

2019-08-30 08:39:33

WebSocketNginx服務器

2019-07-22 09:46:28

WebSocketNginx服務器

2025-03-19 08:40:00

2019-09-10 16:25:19

Python內存空對象

2019-06-05 12:49:07

云辦公

2015-11-27 10:13:19

數據中心

2016-01-08 14:23:55

2012-03-23 10:27:08

觸屏手機點擊區域

2017-12-15 21:46:45

2011-12-09 17:41:56

2010-10-12 12:10:52

增強無線網絡信號

2018-08-15 08:47:20

2010-05-13 00:03:44

2013-11-25 10:43:32

谷歌微軟

2016-03-31 14:51:33

多云計算多云部署多云管理

2023-12-12 08:50:22

MySQL隱式轉換varchar

2015-03-06 10:33:02

2020-06-30 09:25:49

無線路由器Wi-Fi網絡

2021-06-10 05:17:52

QQ應用手機QQ
點贊
收藏

51CTO技術棧公眾號

超碰手机在线观看| 天天影视色综合| 欧美视频综合| 秋霞av亚洲一区二区三| www.色综合| 中文字幕色网站| 91九色在线播放| 久久这里只有精品首页| 国产精品高清网站| 欧美日韩精品亚洲精品| 要久久爱电视剧全集完整观看| 欧美在线综合视频| www.欧美黄色| 精华区一区二区三区| 国内精品不卡在线| 青青草原成人在线视频| 永久久久久久久| 国产午夜一区| 亚洲护士老师的毛茸茸最新章节| 午夜国产一区二区三区| 91福利在线尤物| 一区在线播放视频| 欧美一区二区三区成人久久片| 国产精品探花视频| 丝袜美腿亚洲一区二区图片| 久久精品亚洲精品| 最新中文字幕视频| 影音先锋欧美激情| 欧美日韩国产123区| 免费看国产曰批40分钟| 国产激情小视频在线| 久久精品免费在线观看| 国产一区在线免费观看| 国产美女免费看| 奇米色一区二区三区四区| 久久久久久久国产精品视频| 亚洲AV成人无码精电影在线| 欧美军人男男激情gay| 亚洲国产精品va在线看黑人动漫| 五月天视频在线观看| 经典三级一区二区| 欧美日韩一区二区在线 | 日韩美女写真福利在线观看| 欧美年轻男男videosbes| 2018中文字幕第一页| 老司机在线永久免费观看| 久久午夜电影网| 精品日韩欧美| 天天摸天天碰天天爽天天弄| 东方欧美亚洲色图在线| 91沈先生作品| 99久久亚洲精品日本无码| 麻豆国产一区二区| 国产日韩精品综合网站| 免费看av在线| 久久国产麻豆精品| 国产精品免费久久久| 国产精品自拍第一页| 麻豆九一精品爱看视频在线观看免费| 久久人91精品久久久久久不卡| 欧美激情精品久久| 欧美黄污视频| 欧美激情视频网站| 日产欧产va高清| 国产日韩欧美一区在线| 26uuu另类亚洲欧美日本一| 日本网站在线免费观看| 亚洲视频www| 国产91色在线| 中文av免费观看| 久久精品72免费观看| 91精品久久久久久久久久另类| 亚洲天堂一二三| 国产麻豆精品在线观看| 亚洲直播在线一区| 欧美 日韩 国产 成人 在线 91| 成人av片在线观看| 久久久久久久免费| 欧美激情a∨在线视频播放 | 国产精品一区二区美女视频免费看 | 日本污视频在线观看| 亚洲国产国产亚洲一二三| 97婷婷涩涩精品一区| 人人爽人人爽人人片av| 日本欧美一区二区| 亚洲综合精品伊人久久| 日韩有码第一页| 久久久久久久久久久久久久久99 | 91一区二区三区| 手机看片福利在线| 久久精品免费在线观看| 精品国产三级a∨在线| 久久久久黄久久免费漫画| 欧美日韩国产色视频| 亚洲国产日韩欧美在线观看| 日韩欧美高清一区二区三区| 精品小视频在线| av资源在线免费观看| 欧美日韩一区二区国产| 日本免费久久高清视频| 国产av一区二区三区精品| www..com久久爱| 一本一道久久a久久精品综合| 日韩另类在线| 欧美私模裸体表演在线观看| 日韩女优在线视频| 狠狠色狠狠色综合婷婷tag| 欧美日本亚洲视频| 嫩草影院一区二区三区| 成人av影院在线| 国产精品夜夜夜爽张柏芝| 中文在线最新版地址| 日韩三级视频中文字幕| 亚洲区免费视频| 影音先锋亚洲精品| 国产日韩欧美影视| 欧美日韩影视| 亚洲成av人片在线观看| 拔插拔插华人永久免费| 久久99蜜桃| 久久久久九九九九| 国产裸体无遮挡| 欧美激情资源网| 妺妺窝人体色www在线小说| 看亚洲a级一级毛片| 中国人与牲禽动交精品| 国产精品久久久免费视频| 国产精品亚洲午夜一区二区三区| 日韩区国产区| 欧美动物xxx| 日韩黄色高清视频| 久久高清无码视频| 国产一区二区三区免费播放| 亚洲精品视频一二三| 外国成人直播| 亚洲精品视频免费在线观看| 五月天综合在线| 丁香激情综合五月| 欧美美女黄色网| 久久99成人| 欧美成人午夜激情在线| 97精品人妻一区二区三区| 中文文精品字幕一区二区| 99精品视频在线看| 精品亚洲精品| 97视频在线免费观看| 午夜国产在线视频| 欧美日韩国产黄| 亚洲一区二区三区四区五区六区| 亚洲午夜精品久久久久久app| 91久久爱成人| 亚洲七七久久综合桃花剧情介绍| 91精品国产91久久久久久一区二区| 三级黄色片在线观看| 久久99久久久久| 在线观看福利一区| 成人综合日日夜夜| 欧美精品免费播放| 亚洲AV无码国产精品午夜字幕| 一区二区在线观看免费视频播放| 91精产国品一二三| 日韩视频二区| 欧美另类视频在线| 成人av色网站| 久久艹在线视频| 秋霞av鲁丝片一区二区| 大桥未久av一区二区三区| 无码熟妇人妻av| 青青草国产精品97视觉盛宴| 亚洲国产一区二区在线| a一区二区三区亚洲| 欧美另类暴力丝袜| 五月婷婷六月激情| 欧美亚洲动漫制服丝袜| av黄色免费在线观看| 国产精品99久久久久久似苏梦涵 | 韩国三级一区| 久久国产精品免费视频| 欧美 日韩 综合| 色域天天综合网| 欧美视频一区二区在线| 国产精品一区在线观看乱码| 青青草视频在线免费播放| 蜜乳av综合| 91亚洲va在线va天堂va国| 黄色美女视频在线观看| 亚洲精选一区二区| 91精品中文字幕| 午夜视频在线观看一区二区三区 | 欧美亚洲国产一区| av噜噜色噜噜久久| 欧美三区四区| 欧美精品www| a天堂中文在线| 精品美女在线观看| 中国a一片一级一片| 一区二区三区在线看| 免费污网站在线观看| 国产一区视频在线看| 久久成人免费观看| 水蜜桃精品av一区二区| 国产一区二区三区无遮挡| 国产极品嫩模在线观看91精品| 欧美福利视频在线观看| yw视频在线观看| 亚洲国产日韩欧美综合久久| 91丨九色丨丰满| 精品国产精品三级精品av网址| 2017亚洲天堂| 91免费版在线看| 无码人妻丰满熟妇区毛片蜜桃精品 | 黄色欧美在线| 成人伊人精品色xxxx视频| 日本不卡1234视频| 欧美俄罗斯性视频| 日本中文字幕在线2020| 亚洲女人天堂av| 秋霞欧美在线观看| 日韩欧美一区二区在线视频| 亚洲一区在线观| 色嗨嗨av一区二区三区| 91在线看视频| 亚洲国产精品久久久男人的天堂| 少妇高潮惨叫久久久久| 国产婷婷色一区二区三区四区 | 欧美性受xxxx黑人猛交| 超碰porn在线| 最新中文字幕亚洲| 加勒比一区二区三区在线| 亚洲第一福利网站| 黑人精品一区二区三区| 日韩免费视频一区| 国产精品熟女久久久久久| 欧美亚洲一区二区在线| 国产一区二区视频网站| 天天综合天天做天天综合| 国产性70yerg老太| 伊人夜夜躁av伊人久久| 国产探花在线视频| 中文字幕乱码日本亚洲一区二区| 成人免费网站黄| 久久女同精品一区二区| 亚洲第一黄色网址| 91亚洲男人天堂| 一区二区视频观看| 91年精品国产| 亚洲黄色在线网站| 久久久影院官网| av小说在线观看| 久久精品人人做人人综合| 一级性生活毛片| 国产日产精品一区| 国产毛片欧美毛片久久久| 国产精品人妖ts系列视频| 青青青视频在线播放| 国产精品污www在线观看| 萌白酱视频在线| 亚洲激情网站免费观看| 久久精品视频9| 欧美日韩激情小视频| 国产99久久久| 精品视频一区二区不卡| 亚洲一级特黄毛片| 欧美一区二区黄| 国产 欧美 精品| 精品亚洲一区二区三区在线观看| 欧美日韩视频精品二区| 色悠悠久久88| 2024最新电影免费在线观看| 久久免费视频在线观看| 成人免费看黄| 国产日韩欧美在线| 网站一区二区| 久久久久久久久久久久久9999| 国产欧美日韩| gogogo免费高清日本写真| 狠狠入ady亚洲精品| 99精品在线免费视频| 日韩高清一区二区| 久久精品无码一区二区三区毛片| 成人国产精品视频| 人人人妻人人澡人人爽欧美一区| 国产精品久久久久久久久动漫 | 色婷婷综合五月| 一区二区三区日| 亚洲国产中文字幕久久网| 成人一区二区不卡免费| 九九久久综合网站| 吉吉日韩欧美| 96国产粉嫩美女| 亚洲精品一级二级三级| 男人的天堂成人| 午夜宅男久久久| 国产一级片中文字幕| 91在线观看高清| 小向美奈子av| 欧美日韩综合视频| 国产又大又粗又硬| 亚洲精品视频在线播放| 羞羞网站在线看| 国产成人精品999| 欧洲一区在线| 日本高清不卡三区| 欧美日韩国产色综合一二三四| 少妇人妻互换不带套| 国产suv精品一区二区883| 精品亚洲aⅴ无码一区二区三区| 一个色在线综合| 夜夜躁狠狠躁日日躁av| 日韩av网站电影| 日本在线观看高清完整版| 国产精品久久久久久一区二区| 久久中文字幕导航| 久久视频免费在线| 麻豆传媒一区二区三区| a视频免费观看| 亚洲综合色在线| 91精品国产乱码久久久久| 亚洲欧美另类自拍| а√天堂资源官网在线资源| 91人成网站www| 成人亚洲一区二区| 国产美女三级视频| 99麻豆久久久国产精品免费优播| 成人免费黄色小视频| 欧美视频一区二区| 免费在线黄色影片| 77777亚洲午夜久久多人| 一本色道69色精品综合久久| 日本黄色a视频| 老司机精品视频在线| 色一情一交一乱一区二区三区| 欧美日韩午夜视频在线观看| 免费国产黄色片| 久久久久久av| jazzjazz国产精品久久| 激情五月五月婷婷| 国产一区二区在线电影| 国产色无码精品视频国产| 欧美日韩国产区一| 3p视频在线观看| 国产日韩在线亚洲字幕中文| 热久久天天拍国产| 美女一区二区三区视频| 久久精品一区二区| 亚洲中文一区二区| 这里只有精品丝袜| 日韩精品一级毛片在线播放| 先锋在线资源一区二区三区| 青青草成人在线观看| 又色又爽的视频| 制服丝袜亚洲精品中文字幕| 欧美日本一道| 91香蕉电影院| 黄色欧美成人| 在线黄色免费网站| 欧美日韩一区免费| 高清美女视频一区| 91免费人成网站在线观看18| 欧美91精品| 亚洲国产精品自拍视频| 色又黄又爽网站www久久| 国产在线日本| 成人美女av在线直播| 欧美欧美全黄| 国产老熟女伦老熟妇露脸| 欧美日韩激情网| 99精品老司机免费视频| 91老司机在线| 亚洲二区视频| 亚洲欧美va天堂人熟伦| 欧美男男青年gay1069videost| av网站免费在线观看| 激情视频一区二区| 三级影片在线观看欧美日韩一区二区| 亚洲不卡的av| 亚洲成人性视频| 日韩中文在线播放| 久久久久亚洲av无码专区喷水| 丁香婷婷综合激情五月色| 日日夜夜狠狠操| 久久av在线播放| 亚洲精品国产setv| 蜜桃福利午夜精品一区| 亚洲妇熟xx妇色黄| 成人精品一区二区三区免费 | 精品产国自在拍| 视频区 图片区 小说区| 欧美日韩免费区域视频在线观看| 国产福利免费在线观看| 成人片在线免费看| 日韩精品国产精品| 久久久久亚洲av无码专区| 亚洲人成网站免费播放| 欧美9999| 日韩无套无码精品| 亚洲一区二区三区中文字幕在线| 欧美少妇另类| 国产精品一区在线观看| 美女免费视频一区|