精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日韩不卡一区二区三区| 国产成人手机高清在线观看网站| 一区二区三区免费网站| 国产自产精品| 在线视频欧美亚洲| 精品成人久久| 在线日韩av观看| 韩国三级在线看| 欧美无毛视频| 亚洲综合成人在线| 亚洲高清乱码| 午夜18视频在线观看| 久色婷婷小香蕉久久| 久久免费视频在线观看| 手机看片国产日韩| 欧美理论电影在线精品| 3751色影院一区二区三区| 国产h视频在线播放| 精产国品自在线www| 久久综合99re88久久爱| 亚洲在线视频福利| 波多野结衣午夜| 亚洲三级影院| 欧美剧在线观看| 国产一二三av| 视频福利一区| 精品人伦一区二区色婷婷| 少妇网站在线观看| 一根才成人网| 婷婷开心激情综合| 97av中文字幕| 国产在线激情| 国产精品国产三级国产aⅴ原创 | 精品视频无码一区二区三区| 日韩激情av| 亚洲欧美一区二区视频| 污视频在线免费观看一区二区三区| 蜜臀久久久久久999| 国产高清一区日本| 91精品久久久久久久久久另类| 亚洲成人第一网站| 国产美女一区| 97久久国产精品| 久草精品视频在线观看| 欧美三区美女| 欧美极品少妇与黑人| 国产精品三区在线观看| 五月天综合网站| xvideos亚洲人网站| 99精品中文字幕| 久久国产成人精品| 日韩在线高清视频| 999福利视频| 青青草原综合久久大伊人精品| 亚洲三级 欧美三级| 精品人妻无码一区二区三区 | 国产精品成人免费一区二区视频| 一区二区三区四区日韩| 萌白酱国产一区二区| 欧美肥妇bbwbbw| 综合激情一区| 久久久久久亚洲精品中文字幕| 国产一级视频在线观看| 亚洲国产一区二区三区a毛片 | 亚洲视频第一页| 久久久久久久毛片| 日韩欧美不卡| 久久天堂av综合合色| 久久久久久久久久久网| 在线欧美日韩| 日韩av免费在线看| 亚洲一级特黄毛片| 国产黑丝在线一区二区三区| 国产在线视频欧美一区二区三区| 欧美精品a∨在线观看不卡 | 国产精品99精品久久免费| 不卡一区二区三区视频| 天天综合网在线| 国产日韩精品视频一区| 一本久道久久综合狠狠爱亚洲精品| 免费a级毛片在线播放| 亚洲精品免费在线| 国产在线精品91| 91国内外精品自在线播放| 69精品人人人人| 午夜不卡久久精品无码免费| 欧美日韩国产在线观看网站 | 国产社区精品视频| 欧美亚洲国产一区在线观看网站| 国产女同无遮挡互慰高潮91| 99精品中文字幕在线不卡| 亚洲欧美国产精品久久久久久久| 国产在线免费av| 欧美日本不卡高清| 国产精品av电影| 成人h动漫精品一区二区无码 | 精品久久久久久亚洲综合网| 永久免费看mv网站入口78| 99re66热这里只有精品8| 国内精品视频一区| 亚洲最大成人av| 91原创在线视频| 精品日韩在线播放| 欧美大片高清| 精品久久久久99| 亚洲不卡的av| 中文日韩欧美| 91福利视频导航| 第三区美女视频在线| 亚洲影视在线播放| 成年人三级黄色片| 久久91精品| 国内偷自视频区视频综合| 高潮毛片又色又爽免费| 国产精品一级片在线观看| 日本在线高清视频一区| 麻豆av在线免费观看| 欧美日韩国产中文| 中文字幕高清视频| 亚洲经典三级| 99中文视频在线| 午夜不卡视频| 欧美在线一二三| 亚洲久久久久久| 国产一区亚洲| 91沈先生在线观看| 3d成人动漫在线| 色婷婷综合久色| 捆绑裸体绳奴bdsm亚洲| 亚洲欧美在线专区| 国产日韩欧美黄色| lutube成人福利在线观看| 五月激情综合色| 中文字幕人妻熟女在线| 欧美二区不卡| 91在线看www| а天堂中文在线官网| 欧美日韩不卡一区二区| 日本理论中文字幕| 日韩精品福利网| 欧美国产综合视频| 一二三四视频在线中文| 亚洲精品福利资源站| 久久免费黄色网址| 成人免费毛片a| 成人在线视频一区二区三区 | 国产一区二区在线观看免费播放| 午夜羞羞小视频在线观看| 欧美一区二区三区在线观看| 91精品少妇一区二区三区蜜桃臀| 精品一区二区三区视频| 大地资源第二页在线观看高清版| 国产麻豆一区| 久久精品成人欧美大片古装| 亚洲资源在线播放| 亚洲另类在线制服丝袜| 性生交大片免费看l| 欧美日韩亚洲一区三区| 国产精品有限公司| 樱花草涩涩www在线播放| 亚洲欧洲国产伦综合| 五月婷婷激情五月| 中文字幕一区二区三区精华液 | 99久久伊人网影院| 成人在线激情网| 欧美视频免费| 91精品视频观看| 免费看电影在线| 精品亚洲一区二区三区四区五区| 销魂美女一区二区| 亚洲三级免费观看| 东京热av一区| 石原莉奈在线亚洲二区| 在线精品日韩| 51精品国产| 欧美做受高潮电影o| 91在线视频| 日韩欧美一级精品久久| 91视频免费网址| 国产精品系列在线| 国产人妖在线观看| 天堂va蜜桃一区二区三区| 一区二区国产日产| av男人一区| 国产精品美女视频网站| 91精品国产91久久久久久青草| 精品99一区二区三区| 黄色av一区二区| 亚洲久草在线视频| 中国毛片在线观看| 国产乱码精品一品二品| 欧美精品色婷婷五月综合| 93在线视频精品免费观看| 国产尤物91| 日本久久二区| 欧美一区二粉嫩精品国产一线天| 欧美精品日韩少妇| 国产丝袜一区视频在线观看 | 亚洲欧洲免费视频| 国产高清免费av| 日本韩国精品在线| 久草视频免费在线| 国产精品午夜久久| 精品国产av色一区二区深夜久久| 久久99久久久久久久久久久| 亚洲午夜精品久久久久久人妖| 欧美3p在线观看| 欧美精品一区在线| 91精品入口| 成人免费福利在线| 最新欧美电影| 国内成人精品一区| 先锋成人av| 久久黄色av网站| 国产二区在线播放| 日韩成人xxxx| www.色播.com| 欧美一区日韩一区| 中文字幕欧美色图| 色乱码一区二区三区88| 日韩精品一区二区三| 亚洲精品va在线观看| 肉色超薄丝袜脚交69xx图片 | av免费在线一区| 97热在线精品视频在线观看| 尤物yw193can在线观看| www日韩欧美| www.av在线| 亚洲偷欧美偷国内偷| 肉丝一区二区| 亚洲国产日韩一区| 人妻无码中文字幕| 精品久久五月天| 午夜精品一二三区| 精品日本一线二线三线不卡| av在线亚洲天堂| 91精品国产一区二区三区| 国产又黄又粗又长| 欧美老女人在线| 国产精品久久久午夜夜伦鲁鲁| 欧美丝袜自拍制服另类| 色婷婷久久综合中文久久蜜桃av| 日本韩国精品在线| 中日韩在线观看视频| 欧美亚州韩日在线看免费版国语版| 香蕉影院在线观看| 色播五月激情综合网| 老熟妇一区二区三区| 日韩欧美有码在线| 亚洲精品无码久久久久| 欧美视频完全免费看| 亚洲午夜精品久久久| 3d成人h动漫网站入口| 国产av无码专区亚洲av麻豆| 日韩免费视频一区| 女人18毛片水真多18精品| 亚洲精品国产拍免费91在线| 婷婷国产在线| 国产亚洲欧美视频| 五月婷婷在线视频| 欧美精品免费在线观看| 青青青国内视频在线观看软件| 久久久久久久久久久亚洲| 牛牛精品在线| 午夜伦理精品一区| 日韩视频网站在线观看| 国产欧美最新羞羞视频在线观看| 日本精品久久| 国产精品三区www17con| 亚洲黄色录像| 一本色道久久综合亚洲二区三区| 五月精品视频| 欧美 日韩 亚洲 一区| 石原莉奈一区二区三区在线观看| 污污网站在线观看视频| 成人午夜伦理影院| 麻豆精品免费视频| 亚洲图片欧美激情| 午夜毛片在线观看| 欧美三级中文字| www.五月婷婷| 亚洲视频在线观看网站| 国产传媒在线播放| 91产国在线观看动作片喷水| 欧美黄色网络| 好看的日韩精品| 日韩中字在线| 日韩av在线第一页| 韩日精品视频一区| 国产网站无遮挡| 日韩美女精品在线| 午夜婷婷在线观看| 69堂成人精品免费视频| 日本一区二区三区在线观看视频| 伊人久久久久久久久久| 中文在线免费| 国产精品一区二区三区久久| 精品精品国产三级a∨在线| 亚洲国产精品一区二区第四页av| 精品二区久久| 成人黄色一级大片| 久久精品水蜜桃av综合天堂| 国产suv一区二区三区| 色呦呦网站一区| 囯产精品久久久久久| 日韩视频永久免费观看| 成人自拍av| 国产伦精品一区二区三区视频孕妇 | 青青草国产精品亚洲专区无| 国产白袜脚足j棉袜在线观看| 国产精品二区一区二区aⅴ污介绍| 日韩av在线电影| 7777精品伊人久久久大香线蕉的| 国产有码在线| 91精品国产91久久久| 日韩中文字幕一区二区高清99| 日韩在线第一区| 久久成人一区| 强迫凌虐淫辱の牝奴在线观看| 亚洲精品久久久久久国产精华液| 一区二区视频免费观看| 亚洲午夜未删减在线观看 | 国产精品va在线播放我和闺蜜| 懂色av一区二区| 91视频 - 88av| 国产一区二区在线观看免费| 日本美女xxx| 色综合色综合色综合色综合色综合| 蜜臀久久精品久久久久| 欧美高清视频在线| 日韩视频在线直播| 一区二区三区四区免费观看| 久久精品国产99国产| 人与嘼交av免费| 91高清视频免费看| 韩国中文免费在线视频| 欧美一区二区三区艳史| 首页亚洲中字| 国产无套内射久久久国产| 久久综合色一综合色88| 天堂中文在线网| 日韩精品在线观| 345成人影院| 日本10禁啪啪无遮挡免费一区二区| 久久久久久黄| 青娱乐国产视频| 精品视频一区二区不卡| 91精品大全| 成人亚洲综合色就1024| 91成人影院| 91精品国产高清91久久久久久| 亚洲综合色区另类av| 黄色片一区二区| 欧美在线视频免费| 精品国产aⅴ| 亚洲黄色av片| 一区二区三区在线观看国产| 国产91免费在线观看| 26uuu国产精品视频| 欧美男gay| 五月天中文字幕在线| 玉足女爽爽91| 香蕉久久一区二区三区| 日韩av手机在线看| 久久一区91| 欧美图片自拍偷拍| 欧美视频一二三| 最新国产在线观看| 亚洲自拍偷拍网址| 亚洲精品美女91| av电影网站在线观看| 欧美日韩的一区二区| 男插女视频久久久| 蜜桃成人免费视频| 麻豆成人久久精品二区三区红| 国产高潮国产高潮久久久91| 亚洲黄色av网站| 色猫猫成人app| 欧美人与动牲交xxxxbbbb| 99re亚洲国产精品| 在线观看免费视频a| 欧美精品www| 欧美一站二站| 熟妇高潮一区二区| 欧美性感一区二区三区| 手机av免费在线| 青娱乐一区二区| 国产精品一区免费视频| 黄瓜视频在线免费观看| 久久夜色精品国产欧美乱| 欧美自拍视频| 久久aaaa片一区二区| 色av一区二区| 免费污视频在线观看| 亚洲精品视频一区二区三区| 成人综合激情网| 亚洲无码精品国产| 日韩av电影国产| 亚洲国产裸拍裸体视频在线观看乱了中文 | 精品国产鲁一鲁一区二区张丽|