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

我們一起聊聊指針與函數

開發 前端
日常開發中,我還真沒找到指針函數的“優點”,讓我覺得某個功能必須用指針函數實現,或用指針函數實現后代碼更整潔,提高代碼可讀性。

指針函數

指針函數,從名字上看它本質上是一個函數。指針函數:返回值類型是指針的函數。函數聲明如下:

int *plusfunction(int a,int b);

當然也可以寫成如下格式:

int* plusfunction(int a,int b);

讓指針標志 * 與int緊貼在一起,而與函數名f間隔開,這樣看起來就明了些了,plusfunction是函數名,返回值類型是一個int類型的指針。

指針函數就是一個普通的函數,普通到僅僅是因為它的函數返回值是指針而已。

#include <stdio.h>
#include <stdlib.h>
int* plusfunction(int a,int b);
int main()
{
int *p = NULL;
p = plusfunction(1,2);
printf("*p is %d\n",*p);
free(p);
return(0);
}

int* plusfunction(int a,int b)
{
int *p = (int *) malloc( sizeof(int) );
*p = a + b;
return(p);
}

這是一個簡單的指針函數的例子,運行結果如下,本文代碼在VScode平臺運行,使用方法《使用VScode調試C語言》。

不過我有個疑問,使用指針函數,和函數入參是指針有什么好處呢???

#include <stdio.h>
#include <stdlib.h>
void plusfunction(int a,int b,int *p);
int main()
{
int *p = NULL;
p = (int *) malloc(sizeof(int) );
plusfunction(1,2,p);
printf("*p is %d\n",*p);
free(p);
return(0);
}

void plusfunction(int a,int b,int *p)
{
*p = a + b;
}

這樣執行也是沒問題的啊,當然我也發現了指針函數的好處,就是可以把函數作為另一個函數的入參。

testfunction(plusfunction(1,2));

在這點上用第二種方法,將指針作為函數入參是不行的。

還有,將指針作為函數入參前需要向指針申請內存,而指針函數卻不用。

除去這兩點,日常開發中,我還真沒找到指針函數的“優點”,讓我覺得某個功能必須用指針函數實現,或用指針函數實現后代碼更整潔,提高代碼可讀性。

函數指針

函數指針,本質上他是一個指針,并不是一個函數。在C語言中有些概念是一脈相承的,之前的推文《指針與數組》,數組指針和指針數組的概念更有效幫你理解函數指針和指針函數。函數指針說的就是一個指針,但這個指針指向的函數,不是普通的基本數據類型或者類對象。函數指針定義如下:

int (*f)(int a,int b);//聲明函數指針

和指針函數的定義對比可以看到,函數指針與指針函數的最大區別是函數指針的函數名是一個指針,即函數名前面有一個指針類型的標志型號“*”。注意指針函數與函數指針表示方法的不同,千萬不要混淆。最簡單的辨別方式就是看函數名前面的指針*號有沒有被括號()包含,如果被包含就是函數指針,反之則是指針函數。當然,函數指針的返回值也可以是指針。簡單的函數調用示例:

#include <stdio.h>
void MyFun(int a);
int main()
{
MyFun(10);
return(0);
}
void MyFun(int a)
{
printf("a is %d\n",a);
}

這是一個再簡單不過的函數調用了,其實他還可以寫作下面格式:

#include <stdio.h>
void MyFun(int a);
int main()
{
(*MyFun)(10);
return(0);
}
void MyFun(int a)
{
printf("a is %d\n",a);
}

這個代碼是正常運行的,也就是說(*MyFun)(10);和MyFun(10);是一樣的,在這里強烈建議沒有看過《指針與數組》的同學,先看一下。在教材和資料中,都會講到數組名就是指向數組第一個數據的常量指針。從上面例子看到,函數名貌似也是“常量指針”。數組中,可以將數組名賦給一個指針,然后通過指針訪問數組中的內容,那么我們就可以定義一個函數指針,將函數名賦給函數指針,通過這個函數指針調用函數。

#include <stdio.h>
void MyFun(int a);/* 這個聲明也可寫成:void MyFun( int )*/
void (*FunP)(int);/*也可聲明成void(*FunP)(int x),但習慣上一般不這樣。 */
int main()
{
FunP = MyFun;
*FunP(10);
return(0);
}
void MyFun(int a)
{
printf("a is %d\n",a);
}

在第7行在函數指針前加*相當取指針的值,在這里理解為將MyFun函數取出。那么再進一步:

#include <stdio.h>
void MyFun(int a); /* 這個聲明也可寫成:void MyFun( int )*/
void (*FunP)(int); /*也可聲明成void(*FunP)(int x),但習慣上一般不這樣。 */
int main()
{
FunP = MyFun;
FunP(10);
return (0);
}
void MyFun(int a)
{
printf("a is %d\n", a);
}

是的,將FunP前面的*號拿掉也是可以運行的,上面的示例代碼就是函數指針在C語言中的最常見形態。之前的例子只是為了讓你更能理解函數指針,實際開發中只需要用函數指針的最終,最常見的形態即可。

不然代碼中出現之前的形式,其他程序員并不是很熟悉,就成了“騷操作”,雖然不影響運行,但是降低代碼的可閱讀性。

typedef的引入

C語言中typedef關鍵字作用:復雜的聲明定義簡單的別名,很明顯我們上面講述的函數指針就是一個比較復雜的類型,可以使用typedef關鍵字將函數指針的定義簡單化。

#include <stdio.h>
void MyFun(int a); /* 這個聲明也可寫成:void MyFun( int )*/
typedef void (*FunType)(int); /*這樣只是定義一個函數指針類型 */
FunType FunP; /*然后用FunType類型來聲明全局FunP變量*/
int main()
{
FunP = MyFun;
FunP(10);
return (0);
}
void MyFun(int a)
{
printf("a is %d\n", a);
}

強烈建議使用typedef和函數指針組合的方式,這是最常見的方式,大家都能看懂的常規操作。在C語言的教程中typedef用于取別名,形式下:

typedef 舊名字 新名字;

確實也是這樣,但遇到給函數指針類型、數組類型等定義別名的時候就要特別區分了。如:


typedef char ARRAY20[20];
ARRAY20 a1,a2; /* 等價于char a1[20],a2[20]; */

typedef void (*FunType)(int); /*這樣只是定義一個函數指針類型 */
FunType FunP; /*然后用FunType類型來聲明全局FunP變量*/

別問我為什么,因為我也不知道。

當然,并不是說用到了函數指針就要用typedef定義一下,一般在結構體中使用函數指針就不會使用typedef,如下:

typedef struct
{
uint8_t data;
void (*FunP)(int);
}Mode_Typedef;

以上均為個人建議,沒有優劣,大家根據自己的習慣做即可。

函數指針作為入參

既然函數指針變量是一個變量,當然也可以作為某個函數的參數來使用的。所以,你還應知道函數指針是如何作為某個函數的參數來傳遞使用的。示例代碼如下:

#include <stdio.h>
void MyFun1(int x);
void MyFun2(int x);
void MyFun3(int x);
typedef void (*FunType)(int); /* ②. 定義一個函數指針類型FunType,與①函數類型一致 */
void CallMyFun(FunType fp, int x);
int main(int argc, char *argv[])
{
CallMyFun(MyFun1, 10); /* ⑤. 通過CallMyFun函數分別調用三個不同的函數 */
CallMyFun(MyFun2, 20);
CallMyFun(MyFun3, 30);
}
void CallMyFun(FunType fp, int x) /* ③. 參數fp的類型是FunType。*/
{
fp(x); /* ④. 通過fp的指針執行傳遞進來的函數,注意fp所指的函數是有一個參數的。 */
}
void MyFun1(int x) /* ①. 這是個有一個參數的函數,以下兩個函數也相同。 */
{
printf("MyFun1:%d\n", x);
}
void MyFun2(int x)
{
printf("MyFun2:%d\n", x);
}
void MyFun3(int x)
{
printf("MyFun3:%d\n", x);
}

運行結果如下:

可以看到,CallMyFun函數的參數是一個指針,當這個函數指針有參數時,需要通過另外增加一個參數來保存回調函數的參數值,同理也可以使用多個參數的函數指針。

單片機IAP

在單片機OTA時常用到函數指針,代碼如下:

typedef void (*IapFun)(void);//定義一個函數指針
IapFun Jump_To_Application;//定義函數指針對象
if (((*(__IO uint32_t*)appxaddr) & 0x2FFE0000 ) == 0x20000000)//檢查地址是否有效
{
Jump_To_Application = (iapfun) * (__IO uint32_t *)(appxaddr + 4);//用戶代碼區第二個字為程序開始地址(復位地址)
MSR_MSP(*(__IO uint32_t *)appxaddr);//初始化APP堆棧指針(用戶代碼區的第一個字用于存放棧頂地址)
Jump_To_Application();//跳轉app
}

這里直接將地址強制轉換成函數指針,然后執行這個函數。appxaddr地址就是新固件存儲的起始地址,appxaddr+4的位置就是新固建中的Reset_Handler函數,相當于執行了新固件中的Reset_Handler。

責任編輯:武曉燕 來源: 知曉編程
相關推薦

2024-02-26 00:00:00

架構老化重構

2024-02-20 21:34:16

循環GolangGo

2021-08-27 07:06:10

IOJava抽象

2023-06-30 08:18:51

敏捷開發模式

2022-05-24 08:21:16

數據安全API

2023-08-10 08:28:46

網絡編程通信

2023-08-04 08:20:56

DockerfileDocker工具

2023-09-10 21:42:31

2022-09-07 07:27:36

函數元素

2024-01-29 09:01:20

React列表模式

2023-07-04 08:06:40

數據庫容器公有云

2023-12-06 08:26:19

Service數據庫

2023-07-27 07:46:51

SAFe團隊測試

2022-06-26 09:40:55

Django框架服務

2023-12-28 09:55:08

隊列數據結構存儲

2022-10-28 07:27:17

Netty異步Future

2022-11-12 12:33:38

CSS預處理器Sass

2022-02-14 07:03:31

網站安全MFA

2025-03-27 02:00:00

SPIJava接口

2024-02-26 00:00:00

Go性能工具
點贊
收藏

51CTO技術棧公眾號

日韩精品丝袜美腿| 影音先锋在线视频| 日韩精品成人一区二区三区| 国产亚洲欧美视频| 最新国产黄色网址| 俺来也官网欧美久久精品| 久久久99精品久久| 1卡2卡3卡精品视频| 日韩少妇裸体做爰视频| 成人在线丰满少妇av| 日韩欧美国产一区二区三区| 日本精品免费在线观看| 九义人在线观看完整免费版电视剧| 国产精品亚洲第一区在线暖暖韩国| 97人人做人人爱| 亚洲激情图片网| 91精品国产乱码久久久竹菊| 91黄色免费版| 日韩精品视频在线观看视频 | 亚洲最大网站| 亚洲乱码国产乱码精品精可以看| 久久精品国产一区二区三区日韩 | 视频一区二区三区中文字幕| 久久国产视频网站| www亚洲色图| 欧美xxxx在线| 日韩欧美在线影院| 久热精品在线播放| 成人小电影网站| 亚洲综合区在线| 亚洲国产综合自拍| 免费资源在线观看| av一区二区久久| 91九色蝌蚪成人| 国产露脸无套对白在线播放| 久久精品道一区二区三区| 欧美高清视频一区二区| 日韩在线视频网址| 欧美日韩中字| 亚洲人成在线电影| 99久久国产精| 国产欧美自拍一区| 欧美sm极限捆绑bd| 天天av天天操| 先锋影音网一区二区| 欧美日韩在线不卡| 蜜臀视频一区二区三区| 亚洲欧美小说色综合小说一区| 一区二区三区日韩| 久久久久久久久网| 日本在线视频网址| 亚洲最大的成人av| 天天想你在线观看完整版电影免费| 91精彩在线视频| 国产免费成人在线视频| 视频一区二区综合| av在线女优影院| 中文字幕电影一区| 亚洲第一导航| 日本在线免费中文字幕| 国产精品电影院| 天天操天天干天天玩| 国产福利视频在线观看| 亚洲欧美视频在线观看视频| dy888午夜| 四虎影院观看视频在线观看 | 久久久久久久久久久综合| 2020国产在线视频| 亚洲一区二区三区四区五区中文| 日本香蕉视频在线观看| 123区在线| 午夜国产精品一区| 99热成人精品热久久66| av免费在线一区| 欧美中文字幕一区| 久久精品国产露脸对白| 免费欧美网站| 亚洲国产精品字幕| 三级网站在线免费观看| 青青一区二区三区| 久热精品视频在线观看一区| 久久久全国免费视频| 国产日韩1区| 日韩av理论片| 国产精品无码免费播放| 丰满放荡岳乱妇91ww| 鲁鲁狠狠狠7777一区二区| 国产精品一二三区视频| 亚洲男同性视频| 精品久久久久久无码中文野结衣| 国产激情在线播放| 欧美午夜精品电影| 美女扒开腿免费视频| 亚洲人挤奶视频| www.日本久久久久com.| 国产无套粉嫩白浆内谢| 日本视频免费一区| 99re在线| 成人高清免费观看mv| 一区二区三区在线观看视频| 国产最新免费视频| 精品一级视频| 亚洲人成电影网站色…| 欧美色图亚洲视频| 日韩精品一级中文字幕精品视频免费观看| 国产中文欧美精品| 四虎在线免费看| 亚洲欧美日韩国产手机在线| 六月丁香婷婷在线| 日韩黄色av| 国产亚洲一区二区精品| 精品少妇一二三区| 看片网站欧美日韩| 麻豆av一区二区| 羞羞视频在线观看不卡| 在线观看成人免费视频| 中文字幕精品视频在线| 国产精品久久久久久久久久10秀| 91国产精品视频在线| 成人av免费播放| 国产精品情趣视频| 中文字幕无码精品亚洲35| 国产一区二区久久久久| 中文字幕久久久av一区| 日本三级一区二区| 成人性生交大片| 日本一区二区三区四区五区六区| 一根才成人网| 亚洲国产精品国自产拍av秋霞| 日韩视频中文字幕在线观看| 美国一区二区三区在线播放 | 水蜜桃久久夜色精品一区| 97视频免费看| 亚洲av无码乱码国产精品| 1024精品合集| www午夜视频| 日韩黄色大片网站| 国产精品成人一区二区三区吃奶 | 伊人久久精品视频| 久久99国产综合精品免费| caoporn国产精品| 韩国无码av片在线观看网站| 精品国产第一国产综合精品| 少妇激情综合网| 91丨九色丨海角社区| 国产亚洲短视频| 无码无遮挡又大又爽又黄的视频| 欧美成人午夜77777| 午夜精品三级视频福利| 蜜臀久久精品久久久久| 亚洲国产欧美在线人成| 无码人妻一区二区三区在线| 韩国精品一区二区三区| 国产精品一区二区三区精品| 精品精品导航| 亚洲激情在线观看视频免费| 国产乡下妇女做爰毛片| 不卡电影免费在线播放一区| 欧美网站免费观看| 亚州国产精品| 国产aaa精品| 最新97超碰在线| 欧美久久久久中文字幕| 182在线观看视频| 国产一区视频导航| 97碰在线视频| 日韩最新在线| 国产精品电影观看| 男人天堂久久久| 欧美日免费三级在线| 日本一二三区在线观看| 国产成人精品网址| 无码人妻丰满熟妇区96| 精品国产1区| 成人av番号网| 国产色婷婷在线| 日韩精品极品在线观看播放免费视频 | 亚洲免费av一区二区三区| 日韩精品二区| 产国精品偷在线| 老司机2019福利精品视频导航| 国产一区二区三区高清在线观看| 国产精品久久久久久无人区 | 日韩在线不卡视频| 国内精品偷拍视频| 欧美午夜片欧美片在线观看| 夫妇露脸对白88av| 盗摄精品av一区二区三区| 国产亚洲精品网站| 久久国产小视频| 国产99在线播放| 精品国产欧美日韩一区二区三区| 久久成人免费视频| 涩爱av在线播放一区二区| 欧美日韩你懂的| 久草精品视频在线观看| 国产欧美一区二区三区在线看蜜臀| 日本美女久久久| 亚洲欧美日韩国产| 99亚洲精品视频| 一道在线中文一区二区三区| 亚洲一区二区少妇| 全亚洲第一av番号网站| 欧美国产日韩一区二区| www.亚洲.com| 亚洲精品福利在线| 国产精品久久无码一三区| 精品福利在线视频| 一区视频免费观看| 国产日韩欧美精品综合| 800av在线播放| 韩国v欧美v日本v亚洲v| 日本精品一区二区三区四区| 在线国产一区二区| 五月天久久狠狠| 香蕉视频一区| 成人av网站观看| 欧美成人免费全部网站| 欧美一区二区三区精品电影| 2024短剧网剧在线观看| 色婷婷综合成人av| 精品视频一二区| 亚洲精品mp4| 亚洲爱爱综合网| 欧美一区二区三区视频免费播放| 波多野结衣爱爱| 欧美性猛交丰臀xxxxx网站| 久久婷婷一区二区| 亚洲视频一二区| 精品少妇一区二区三区密爱| 久久毛片高清国产| 波多野结衣办公室33分钟| 成人h版在线观看| 一级黄色电影片| 国产精品99久久久久久宅男| 制服丝袜综合网| 男人的天堂久久精品| 亚洲天堂av线| 日日骚欧美日韩| 欧美日韩亚洲一二三| 午夜亚洲视频| 日本精品免费在线观看| 亚洲伊人网站| 播放灌醉水嫩大学生国内精品| 亚洲美女啪啪| 免费在线观看亚洲视频 | 丁香婷婷激情网| 香蕉久久夜色精品| 国产在线观看福利| 久久国产欧美| 无遮挡又爽又刺激的视频| 久久久久看片| 中文字幕无码不卡免费视频| 午夜一区不卡| 已婚少妇美妙人妻系列| 日韩专区中文字幕一区二区| 亚洲色图久久久| 久久国产婷婷国产香蕉| 91视频这里只有精品| 激情综合网最新| 被黑人猛躁10次高潮视频| 国产一二精品视频| 国产精品久久久久久久无码| 26uuu国产电影一区二区| 国产免费一区二区三区网站免费| 国产精品三级av在线播放| 国产又色又爽又高潮免费| 亚洲精品老司机| 日韩精品一区二区三| 日韩欧美一区视频| 亚洲一区二区人妻| 日韩区在线观看| 特级丰满少妇一级aaaa爱毛片| 亚洲国产天堂网精品网站| 少妇又色又爽又黄的视频| 亚洲女人初尝黑人巨大| h视频在线观看免费| 久久视频中文字幕| 第一福利在线视频| 国产精品日日做人人爱| 欧美精品影院| 久久www免费人成精品| 色天天综合网| 久久人人爽人人爽人人av| 三级久久三级久久| 性色av浪潮av| 久久综合丝袜日本网| 午夜精品久久久久99蜜桃最新版| 亚洲一区av在线| 欧美一区二区三区网站| 欧美一区二区在线免费观看| 午夜视频福利在线| 日韩有码在线播放| 欧美aaaaa性bbbbb小妇| 国产综合色香蕉精品| 欧美一区二区三区久久| 一区二区日本| 国产毛片久久| 天堂av手机在线| 久久久久亚洲综合| 私库av在线播放| 在线观看免费亚洲| 狠狠综合久久av一区二区 | 91精品久久| 热99精品里视频精品| 欧洲大片精品免费永久看nba| 欧美视频1区| 亚洲午夜黄色| 日韩av一卡二卡三卡| 久久亚洲一区二区三区四区| 全网免费在线播放视频入口| 91福利社在线观看| 全部免费毛片在线播放一个| 久久精品91久久香蕉加勒比| 国产伦精品一区二区三区视频金莲| 99久久精品免费看国产一区二区三区| 国产成人ay| 久久久久久www| 国产一区二区精品久久91| 国产又黄又粗视频| 婷婷综合在线观看| 国产美女明星三级做爰| 一区国产精品视频| 午夜精品久久久久久久久久蜜桃| 国产精品亚洲一区| 91高清一区| 小明看看成人免费视频| 国产午夜精品理论片a级大结局| 日韩经典在线观看| 精品国产乱码久久久久久浪潮| 麻豆av在线免费看| 国产精品永久免费观看| 国内精品视频在线观看 | 忘忧草在线日韩www影院| 999视频在线免费观看| 自产国语精品视频| 久久精品一卡二卡| 亚洲免费观看高清| 国产三级在线观看视频| 久久精品人人做人人爽| 六九午夜精品视频| 亚洲精品乱码久久久久久蜜桃91| 久久久久看片| 西西444www无码大胆| 91福利视频在线| 香蕉视频国产在线观看| 国产精品日韩av| 色婷婷色综合| 国产精品v日韩精品v在线观看| 欧美国产精品中文字幕| 欧美高清69hd| 色青青草原桃花久久综合| 精品女同一区二区三区在线观看| 亚洲国产另类久久久精品极度| 免费欧美在线视频| 国产wwwwxxxx| 6080午夜不卡| 欧美wwww| 久久国产精品-国产精品| 国产精品久久久久毛片大屁完整版| xxxwww国产| 欧美性猛xxx| 韩国精品视频| 成人两性免费视频| 亚洲综合小说| a天堂视频在线观看| 一本到不卡免费一区二区| 国产精品久久一区二区三区不卡 | h视频久久久| 欧美丰满熟妇bbbbbb百度| 久久久影视传媒| 一级片视频网站| 久久69精品久久久久久国产越南| 操欧美女人视频| 国产成人a亚洲精v品无码| 中文字幕的久久| 国产精品伊人久久| 国内免费精品永久在线视频| 精品一区在线| 亚洲一二三不卡| 大伊人狠狠躁夜夜躁av一区| 成人免费黄色网页| 99影视tv| 久久一区亚洲| 91嫩草|国产丨精品入口| 欧美精品一区二区在线观看| 亚洲日本网址| 国产成人免费高清视频| 久久亚洲欧美国产精品乐播| 一级淫片免费看| 91高清在线免费观看| 93在线视频精品免费观看| 插我舔内射18免费视频| 欧美午夜理伦三级在线观看| caoporn-草棚在线视频最| 亚洲一区在线免费| eeuss影院一区二区三区| 国产又粗又长视频| 日本成人精品在线| 欧美/亚洲一区|