日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

還是結(jié)構(gòu)體指針寫的代碼看著舒服

來源: 責(zé)編: 時(shí)間:2024-05-16 17:42:44 204觀看
導(dǎo)讀一直覺得C語言較其他語言最偉大的地方就是C語言中的指針,有些人認(rèn)為指針很簡單,而有些人認(rèn)為指針很難,當(dāng)然這里的對(duì)簡單和難并不是等價(jià)于對(duì)指針的理解程度。為此在這里對(duì)C語言中的指針進(jìn)行全面的總結(jié),從底層的內(nèi)存分析,徹

一直覺得C語言較其他語言最偉大的地方就是C語言中的指針,有些人認(rèn)為指針很簡單,而有些人認(rèn)為指針很難,當(dāng)然這里的對(duì)簡單和難并不是等價(jià)于對(duì)指針的理解程度。U6D28資訊網(wǎng)——每日最新資訊28at.com

為此在這里對(duì)C語言中的指針進(jìn)行全面的總結(jié),從底層的內(nèi)存分析,徹底讓讀者明白指針的本質(zhì)。U6D28資訊網(wǎng)——每日最新資訊28at.com

U6D28資訊網(wǎng)——每日最新資訊28at.com

U6D28資訊網(wǎng)——每日最新資訊28at.com

一、指針變量

U6D28資訊網(wǎng)——每日最新資訊28at.com

首先讀者要明白指針是一個(gè)變量,為此作者寫了如下代碼來驗(yàn)證之:U6D28資訊網(wǎng)——每日最新資訊28at.com

#include "stdio.h"int main(int argc, char **argv){    unsigned int a = 10;    unsigned int *p = NULL;    p = &a;    printf("&a=%d/n",a);    printf("&a=%d/n",&a);    *p = 20;    printf("a=%d/n",a);    return 0;}

U6D28資訊網(wǎng)——每日最新資訊28at.com

這說明編譯器確實(shí)是在解引時(shí)無法確定*p的大小,因此這里必須告訴編譯器p的類型或者*p的大小,如何告訴呢?很簡單,用強(qiáng)制類型轉(zhuǎn)換即可,如下:U6D28資訊網(wǎng)——每日最新資訊28at.com

*(int*)p

這樣上面的程序就可以寫為如下:U6D28資訊網(wǎng)——每日最新資訊28at.com

#include <stdio.h>int main(int argc, char **argv){    int a=10;    void *p;    p=&a;    printf("p=%d/n",*(int*)p);    return 0;}

編譯運(yùn)行后:U6D28資訊網(wǎng)——每日最新資訊28at.com

U6D28資訊網(wǎng)——每日最新資訊28at.com

可以看到結(jié)果確實(shí)是正確的,也和預(yù)期的想法一致。由于void指針沒有空間大小屬性,因此void指針也沒有++操作。U6D28資訊網(wǎng)——每日最新資訊28at.com

U6D28資訊網(wǎng)——每日最新資訊28at.com

六、函數(shù)指針

U6D28資訊網(wǎng)——每日最新資訊28at.com

1. 函數(shù)指針使用

函數(shù)指針在Linux內(nèi)核中用的非常多,而且在設(shè)計(jì)操作系統(tǒng)的時(shí)候也會(huì)用到,因此這里將詳細(xì)講解函數(shù)指針。既然函數(shù)指針也是指針,那函數(shù)指針也占用4個(gè)字節(jié)(32位編譯器)。U6D28資訊網(wǎng)——每日最新資訊28at.com

下面以一個(gè)簡單的例子說明:U6D28資訊網(wǎng)——每日最新資訊28at.com

#include <stdio.h>int  add(int a,int b){    return a+b;}int main(int argc, char **argv){    int (*p)(int,int);    p=add;    printf("add(10,20)=%d/n",(*p)(10,20));    return 0;}

程序運(yùn)行結(jié)果如下:U6D28資訊網(wǎng)——每日最新資訊28at.com

U6D28資訊網(wǎng)——每日最新資訊28at.com

可以看到,函數(shù)指針的申明為:U6D28資訊網(wǎng)——每日最新資訊28at.com

U6D28資訊網(wǎng)——每日最新資訊28at.com

函數(shù)指針的解引操作與普通的指針有點(diǎn)不一樣。U6D28資訊網(wǎng)——每日最新資訊28at.com

對(duì)于普通的指針而言,解引只需要根據(jù)類型來取出數(shù)據(jù)即可,但函數(shù)指針是要調(diào)用一個(gè)函數(shù),其解引不可能是將數(shù)據(jù)取出,實(shí)際上函數(shù)指針的解引本質(zhì)上是執(zhí)行函數(shù)的過程,只是這個(gè)執(zhí)行函數(shù)是使用的call指令并不是之前的函數(shù),而是函數(shù)指針的值,即函數(shù)的地址。U6D28資訊網(wǎng)——每日最新資訊28at.com

其實(shí)執(zhí)行函數(shù)的過程本質(zhì)上也是利用call指令來調(diào)用函數(shù)的地址,因此函數(shù)指針本質(zhì)上就是保存函數(shù)執(zhí)行過程的首地址。函數(shù)指針的調(diào)用如下:U6D28資訊網(wǎng)——每日最新資訊28at.com

U6D28資訊網(wǎng)——每日最新資訊28at.com

為了確認(rèn)函數(shù)指針本質(zhì)上是傳遞給call指令一個(gè)函數(shù)的地址,下面用一個(gè)簡單例子說明:U6D28資訊網(wǎng)——每日最新資訊28at.com

U6D28資訊網(wǎng)——每日最新資訊28at.com

上面是編譯后的匯編指令,可以看到,使用函數(shù)指針來調(diào)用函數(shù)時(shí),其匯編指令多了如下:U6D28資訊網(wǎng)——每日最新資訊28at.com

0x4015e3    mov    DWORD PTR [esp+0xc],0x4015c00x4015eb    mov    eax,DWORD PTR [esp+0xc]0x4015ef    call   eax

分析:第一行mov指令將立即數(shù)0x4015c0賦值給寄存器esp+0xc的地址內(nèi)存中,然后將寄存器esp+0xc地址的值賦值給寄存器eax(累加器),然后調(diào)用call指令,此時(shí)pc指針將會(huì)指向add函數(shù),而0x4015c0正好是函數(shù)add的首地址,這樣就完成了函數(shù)的調(diào)用。U6D28資訊網(wǎng)——每日最新資訊28at.com

細(xì)心的讀者是否發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象,上述過程中函數(shù)指針的值和參數(shù)一樣是被放在棧幀中,這樣看起來就是一個(gè)參數(shù)傳遞的過程。U6D28資訊網(wǎng)——每日最新資訊28at.com

因此可以看到,函數(shù)指針最終還是以參數(shù)傳遞的形式傳遞給被調(diào)用的函數(shù),而這個(gè)傳遞的值正好是函數(shù)的首地址。U6D28資訊網(wǎng)——每日最新資訊28at.com

從上面可以看到函數(shù)指針并不是和一般的指針一樣可以操作內(nèi)存,因此作者覺得函數(shù)指針可以看作是函數(shù)的引用申明。U6D28資訊網(wǎng)——每日最新資訊28at.com

2. 函數(shù)指針應(yīng)用

在linux驅(qū)動(dòng)面向?qū)ο缶幊趟枷胫杏玫淖疃啵煤瘮?shù)指針來實(shí)現(xiàn)封裝,下面以一個(gè)簡單的例子說明:U6D28資訊網(wǎng)——每日最新資訊28at.com

#include <stdio.h>typedef struct TFT_DISPLAY{    int   pix_width;    int   pix_height;    int   color_width;    void (*init)(void);    void (*fill_screen)(int color);    void (*tft_test)(void);}tft_display;static void init(void){    printf("the display is initialed/n");}static void fill_screen(int color){    printf("the display screen set 0x%x/n",color);}tft_display mydisplay={    .pix_width=320,    .pix_height=240,    .color_width=24,    .init=init,    .fill_screen=fill_screen,};int main(int argc, char **argv){    mydisplay.init();    mydisplay.fill_screen(0xfff);    return 0;}

上面的例子將一個(gè)tft_display封裝成一個(gè)對(duì)象,上面的結(jié)構(gòu)體成員中最后一個(gè)沒有初始化,這在Linux中用的非常多。U6D28資訊網(wǎng)——每日最新資訊28at.com

最常見的是file_operations結(jié)構(gòu)體,該結(jié)構(gòu)體一般來說只需要初始化常見的函數(shù),不需要全部初始化。U6D28資訊網(wǎng)——每日最新資訊28at.com

上面代碼中采用的結(jié)構(gòu)體初始化方式也是在Linux中最常用的一種方式,這種方式的好處在于無需按照結(jié)構(gòu)體的順序一對(duì)一。U6D28資訊網(wǎng)——每日最新資訊28at.com

3. 回調(diào)函數(shù)

有時(shí)候會(huì)遇到這樣一種情況,當(dāng)上層人員將一個(gè)功能交給下層程序員完成時(shí),上層程序員和下層程序員同步工作,這個(gè)時(shí)候該功能函數(shù)并未完成,這個(gè)時(shí)候上層程序員可以定義一個(gè)API來交給下層程序員。U6D28資訊網(wǎng)——每日最新資訊28at.com

而上層程序員只要關(guān)心該API就可以了而無需關(guān)心具體實(shí)現(xiàn),具體實(shí)現(xiàn)交給下層程序員完成即可(這里的上層和下層程序員不指等級(jí)關(guān)系,而是項(xiàng)目的分工關(guān)系)。U6D28資訊網(wǎng)——每日最新資訊28at.com

這種情況下就會(huì)用到回調(diào)函數(shù)(Callback Function),現(xiàn)在假設(shè)程序員A需要一個(gè)FFT算法,這個(gè)時(shí)候程序員A將FFT算法交給程序員B來完成,現(xiàn)在來讓實(shí)現(xiàn)這個(gè)過程:U6D28資訊網(wǎng)——每日最新資訊28at.com

#include <stdio.h>int  InputData[100]={0};int OutputData[100]={0};void FFT_Function(int *inputData,int *outputData,int num){    while(num--)    {    }}void TaskA_CallBack(void (*fft)(int*,int*,int)){    (*fft)(InputData,OutputData,100);}int main(int argc, char **argv){    TaskA_CallBack(FFT_Function);    return 0;}

上面的代碼中TaskA_CallBack是回調(diào)函數(shù),該函數(shù)的形參為一個(gè)函數(shù)指針,而FFT_Function是一個(gè)被調(diào)用函數(shù)。U6D28資訊網(wǎng)——每日最新資訊28at.com

可以看到回調(diào)函數(shù)中申明的函數(shù)指針必須和被調(diào)用函數(shù)的類型完全相同。U6D28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-88564-0.html還是結(jié)構(gòu)體指針寫的代碼看著舒服

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 徹底明白Filter與Interceptor

下一篇: 一個(gè)小技巧,寫出絲滑的 Python 代碼

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美三级资源在线| 欧美日韩一级黄| 亚洲自拍偷拍福利| 午夜精品成人在线| 亚洲国产欧美日韩精品| 激情亚洲成人| 国产综合欧美在线看| 国产视频久久| 国模一区二区三区| 国产尤物精品| 国产一区二区激情| 亚洲第一页自拍| 亚洲美女少妇无套啪啪呻吟| 在线看片成人| 在线欧美电影| 亚洲国产美女久久久久| 亚洲精选一区二区| 亚洲专区免费| 亚洲综合色丁香婷婷六月图片| 亚洲少妇一区| 午夜影院日韩| 久久久999精品免费| 欧美日韩综合一区| 国产免费观看久久| 亚洲三级色网| 亚洲校园激情| 久久国产精品黑丝| 欧美成人中文字幕| 国产亚洲人成网站在线观看| 亚洲大片免费看| 亚洲丝袜av一区| 久久久久www| 久久久久久夜精品精品免费| 欧美日韩不卡视频| 韩国女主播一区二区三区| 亚洲人成欧美中文字幕| 在线性视频日韩欧美| 久久亚洲视频| 国产欧美日韩91| 一本色道久久综合亚洲精品小说| 性久久久久久| 欧美久色视频| 国产亚洲激情| 羞羞漫画18久久大片| 欧美午夜一区二区| 亚洲精品免费网站| 久久综合给合| 欧美日韩一级黄| 亚洲在线日韩| 国产精品美女在线观看| 亚洲精选在线| 免费在线观看成人av| 国产麻豆日韩| 蜜桃精品久久久久久久免费影院| 午夜在线精品偷拍| 国产精品视频一区二区高潮| 亚洲精品国产品国语在线app| 久久都是精品| 国产一区三区三区| 欧美jizz19性欧美| 在线看成人片| 久久人人超碰| 亚洲成人在线| 久久综合国产精品| 亚洲无限乱码一二三四麻| 国产精品成人午夜| 一区二区三区四区国产| 欧美久久影院| 亚洲国产精品一区二区www在线| 欧美日韩免费区域视频在线观看| 在线一区欧美| 国产精品入口| 欧美一区视频| 伊甸园精品99久久久久久| 久久精品人人| 亚洲人妖在线| 欧美午夜不卡| 在线一区亚洲| 国产精品高潮呻吟视频| 欧美中文字幕在线| 日韩视频在线一区二区三区| 欧美性猛交xxxx乱大交蜜桃| 亚洲一区二区三区在线看 | 亚洲国产一区二区三区a毛片| 欧美成人精品不卡视频在线观看| 亚洲欧洲一区二区三区久久| 欧美日韩在线观看一区二区三区| 久久久xxx| 一本综合精品| 国产精品视频网站| 欧美 日韩 国产 一区| 亚洲欧美日韩综合国产aⅴ| 精品盗摄一区二区三区| 欧美日本一区二区三区| 久久久www| 亚洲一区二区高清| 亚洲国产日韩一区二区| 国产精品久久久久99| 欧美va亚洲va国产综合| 久久精品在线观看| 亚洲网站视频福利| 亚洲国产精品第一区二区三区| 国产精品三级视频| 欧美色精品天天在线观看视频| 老司机aⅴ在线精品导航| 亚洲在线免费| 亚洲人成网站精品片在线观看| 国产精品一区免费观看| 欧美日本高清| 欧美r片在线| 久久久久久久综合日本| 欧美在线视频a| 亚洲视频999| 一区二区在线观看视频在线观看| 国产精品中文字幕欧美| 欧美日韩人人澡狠狠躁视频| 免费在线国产精品| 欧美在线黄色| 国产一区二区三区久久| 欧美成人中文字幕| 嫩草成人www欧美| 男女视频一区二区| 欧美成人免费在线观看| 男女激情久久| 欧美日韩国产专区| 欧美三日本三级少妇三99| 国产精品国产a级| 国产日韩欧美在线播放不卡| 国产亚洲欧美在线| 欧美在线地址| 蜜桃视频一区| 欧美日韩精品一区二区在线播放 | 浪潮色综合久久天堂| 亚洲一区三区在线观看| 国产精品网站在线| 免费av成人在线| 欧美一区免费| 亚洲激情第一区| 亚洲高清三级视频| 国产精品久久久亚洲一区| 欧美一级在线播放| 亚洲线精品一区二区三区八戒| 国产视频自拍一区| 经典三级久久| 亚洲九九爱视频| 久久精品国产亚洲精品| 欧美91视频| 国产精品国产三级欧美二区| 亚洲成色www8888| 国产日韩欧美成人| 一区二区三区国产精品| 久久精品国产欧美亚洲人人爽| 久久婷婷影院| 欧美日韩国产一区二区三区| 一区二区三区在线视频播放| 中文在线一区| 久久夜色精品一区| 蜜桃精品久久久久久久免费影院| 欧美日韩不卡一区| 国产精品一区2区| 伊人久久久大香线蕉综合直播| 在线一区二区三区四区五区| 久久久高清一区二区三区| 国产精品午夜春色av| 亚洲一区免费视频| 欧美成年视频| 狠狠色丁香久久婷婷综合_中| 亚洲图片欧洲图片av| 亚洲欧美在线网| 欧美激情视频一区二区三区在线播放| 国产婷婷一区二区| 亚洲在线中文字幕| 国产精品青草久久| 亚洲精品色图| 欧美激情黄色片| 在线观看91精品国产入口| 久久久www成人免费精品| 国产精品久久中文| 午夜精品偷拍| 国产午夜久久| 久久久99久久精品女同性| 国产精品久久久久久av下载红粉| 亚洲图片欧美一区| 国产欧美综合在线| 亚洲成人在线免费| 老司机午夜精品视频| 国产一区在线看| 久久久福利视频| 含羞草久久爱69一区| 久久精品理论片| 亚洲国产va精品久久久不卡综合| 欧美日韩精品二区第二页| 亚洲久久一区| 国产精品久久久亚洲一区| 欧美一区二区大片| 国产一区二区精品在线观看| 久久精品综合一区| 亚洲精品国产无天堂网2021| 欧美午夜电影网| 亚洲一二三四区| 激情视频一区二区| 欧美精品aa| 99re成人精品视频| 亚洲国产婷婷综合在线精品|