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

當前位置:首頁 > 科技  > 軟件

還是結構體指針寫的代碼看著舒服

來源: 責編: 時間:2024-05-16 17:42:44 214觀看
導讀一直覺得C語言較其他語言最偉大的地方就是C語言中的指針,有些人認為指針很簡單,而有些人認為指針很難,當然這里的對簡單和難并不是等價于對指針的理解程度。為此在這里對C語言中的指針進行全面的總結,從底層的內存分析,徹

一直覺得C語言較其他語言最偉大的地方就是C語言中的指針,有些人認為指針很簡單,而有些人認為指針很難,當然這里的對簡單和難并不是等價于對指針的理解程度。bvq28資訊網——每日最新資訊28at.com

為此在這里對C語言中的指針進行全面的總結,從底層的內存分析,徹底讓讀者明白指針的本質。bvq28資訊網——每日最新資訊28at.com

bvq28資訊網——每日最新資訊28at.com

bvq28資訊網——每日最新資訊28at.com

一、指針變量

bvq28資訊網——每日最新資訊28at.com

首先讀者要明白指針是一個變量,為此作者寫了如下代碼來驗證之:bvq28資訊網——每日最新資訊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;}

bvq28資訊網——每日最新資訊28at.com

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

*(int*)p

這樣上面的程序就可以寫為如下:bvq28資訊網——每日最新資訊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;}

編譯運行后:bvq28資訊網——每日最新資訊28at.com

bvq28資訊網——每日最新資訊28at.com

可以看到結果確實是正確的,也和預期的想法一致。由于void指針沒有空間大小屬性,因此void指針也沒有++操作。bvq28資訊網——每日最新資訊28at.com

bvq28資訊網——每日最新資訊28at.com

六、函數指針

bvq28資訊網——每日最新資訊28at.com

1. 函數指針使用

函數指針在Linux內核中用的非常多,而且在設計操作系統的時候也會用到,因此這里將詳細講解函數指針。既然函數指針也是指針,那函數指針也占用4個字節(32位編譯器)。bvq28資訊網——每日最新資訊28at.com

下面以一個簡單的例子說明:bvq28資訊網——每日最新資訊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;}

程序運行結果如下:bvq28資訊網——每日最新資訊28at.com

bvq28資訊網——每日最新資訊28at.com

可以看到,函數指針的申明為:bvq28資訊網——每日最新資訊28at.com

bvq28資訊網——每日最新資訊28at.com

函數指針的解引操作與普通的指針有點不一樣。bvq28資訊網——每日最新資訊28at.com

對于普通的指針而言,解引只需要根據類型來取出數據即可,但函數指針是要調用一個函數,其解引不可能是將數據取出,實際上函數指針的解引本質上是執行函數的過程,只是這個執行函數是使用的call指令并不是之前的函數,而是函數指針的值,即函數的地址。bvq28資訊網——每日最新資訊28at.com

其實執行函數的過程本質上也是利用call指令來調用函數的地址,因此函數指針本質上就是保存函數執行過程的首地址。函數指針的調用如下:bvq28資訊網——每日最新資訊28at.com

bvq28資訊網——每日最新資訊28at.com

為了確認函數指針本質上是傳遞給call指令一個函數的地址,下面用一個簡單例子說明:bvq28資訊網——每日最新資訊28at.com

bvq28資訊網——每日最新資訊28at.com

上面是編譯后的匯編指令,可以看到,使用函數指針來調用函數時,其匯編指令多了如下:bvq28資訊網——每日最新資訊28at.com

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

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

細心的讀者是否發現一個有趣的現象,上述過程中函數指針的值和參數一樣是被放在棧幀中,這樣看起來就是一個參數傳遞的過程。bvq28資訊網——每日最新資訊28at.com

因此可以看到,函數指針最終還是以參數傳遞的形式傳遞給被調用的函數,而這個傳遞的值正好是函數的首地址。bvq28資訊網——每日最新資訊28at.com

從上面可以看到函數指針并不是和一般的指針一樣可以操作內存,因此作者覺得函數指針可以看作是函數的引用申明。bvq28資訊網——每日最新資訊28at.com

2. 函數指針應用

在linux驅動面向對象編程思想中用的最多,利用函數指針來實現封裝,下面以一個簡單的例子說明:bvq28資訊網——每日最新資訊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;}

上面的例子將一個tft_display封裝成一個對象,上面的結構體成員中最后一個沒有初始化,這在Linux中用的非常多。bvq28資訊網——每日最新資訊28at.com

最常見的是file_operations結構體,該結構體一般來說只需要初始化常見的函數,不需要全部初始化。bvq28資訊網——每日最新資訊28at.com

上面代碼中采用的結構體初始化方式也是在Linux中最常用的一種方式,這種方式的好處在于無需按照結構體的順序一對一。bvq28資訊網——每日最新資訊28at.com

3. 回調函數

有時候會遇到這樣一種情況,當上層人員將一個功能交給下層程序員完成時,上層程序員和下層程序員同步工作,這個時候該功能函數并未完成,這個時候上層程序員可以定義一個API來交給下層程序員。bvq28資訊網——每日最新資訊28at.com

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

這種情況下就會用到回調函數(Callback Function),現在假設程序員A需要一個FFT算法,這個時候程序員A將FFT算法交給程序員B來完成,現在來讓實現這個過程:bvq28資訊網——每日最新資訊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是回調函數,該函數的形參為一個函數指針,而FFT_Function是一個被調用函數。bvq28資訊網——每日最新資訊28at.com

可以看到回調函數中申明的函數指針必須和被調用函數的類型完全相同。bvq28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-88716-0.html還是結構體指針寫的代碼看著舒服

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 徹底明白Filter與Interceptor

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

標簽:
  • 熱門焦點
  • 5月iOS設備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數據,像安卓陣營的榜單都有著比較大的變動,不過iOS由于設備的更新換代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設
  • 服務存儲設計模式:Cache-Aside模式

    Cache-Aside模式一種常用的緩存方式,通常是把數據從主存儲加載到KV緩存中,加速后續的訪問。在存在重復度的場景,Cache-Aside可以提升服務性能,降低底層存儲的壓力,缺點是緩存和底
  • 之家push系統迭代之路

    前言在這個信息爆炸的互聯網時代,能夠及時準確獲取信息是當今社會要解決的關鍵問題之一。隨著之家用戶體量和內容規模的不斷增大,傳統的靠"主動拉"獲取信息的方式已不能滿足用
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊 了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步! 了不起:那你最近學習的什么呢? 了不起學弟:最近在學習C
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯網企業調整職級體系并不稀奇。7月13日,淘寶天貓集團啟動了近年來最大的人力制度改革,目前已形成一
  • 信通院:小米、華為等11家應用商店基本完成APP簽名及驗簽工作

    中國信通院表示,目前,小米、華為、OPPO、vivo、360手機助手、百度手機助手、應用寶、豌豆莢和努比亞等9家應用商店,以及抖音和快手2家新型應用分發平
  • 網傳小米汽車開始篩選交付中心 建筑面積不低于3000平方米

    7月7日消息,近日有微博網友@長三角行健者爆料稱,據經銷商集團反饋,小米汽車目前已經開始了交付中心的篩選工作,要求候選場地至少有120個車位,建筑不能低
  • iQOO Neo8系列新品發布會

    旗艦雙芯 更強更Pro
  • iQOO Neo8 Pro真機諜照曝光:天璣9200+和V1+旗艦雙芯加持

    去年10月,iQOO推出了iQOO Neo7系列機型,不僅搭載了天璣9000+,而且是同價位唯一一款天璣9000+直屏旗艦,一經上市便受到了用戶的廣泛關注。在時隔半年后,
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产毛片一区| 伊人成人在线| 欧美性色综合| 欧美日韩高清在线播放| 亚洲成人资源| 欧美国产日韩精品免费观看| 日韩亚洲国产欧美| 欧美三区免费完整视频在线观看| 中文亚洲视频在线| 国产精品久久国产愉拍| 一区二区三区**美女毛片| 136国产福利精品导航网址| 国产伊人精品| 国产女优一区| 99国产精品99久久久久久粉嫩| 欧美在线www| 在线视频欧美精品| 国内自拍一区| 性欧美超级视频| 久久一区激情| 亚洲一区视频| 国产精品老牛| 久久亚洲私人国产精品va| 国产农村妇女精品一二区| 在线一区亚洲| 欧美精品亚洲二区| 国产精品入口| 亚洲欧美日韩另类| 欧美日韩精品一区二区在线播放| 欧美小视频在线| 激情视频亚洲| 亚洲免费视频成人| 欧美肥婆bbw| 国产午夜精品一区理论片飘花 | 久久久久久久一区二区| 欧美日韩亚洲综合| 韩日午夜在线资源一区二区| 一区二区高清视频在线观看| 狼人天天伊人久久| 国产麻豆精品theporn| 亚洲精品永久免费精品| 久久久久久色| 国产精品每日更新| 亚洲国产一区二区精品专区| 欧美一区亚洲二区| 国产精品成人一区二区| 亚洲精品免费看| 久久欧美肥婆一二区| 国产精品一二一区| 亚洲色图综合久久| 欧美激情五月| 在线激情影院一区| 亚洲国产精品一区在线观看不卡| 一区二区三区久久精品| 欧美成人高清视频| 黄色成人av在线| 欧美一区二区三区在线免费观看 | 久久大逼视频| 国产精品欧美一区喷水| 亚洲精选视频免费看| 免费视频久久| 在线观看国产日韩| 久久精品日产第一区二区三区| 国产精品视频免费在线观看| 在线性视频日韩欧美| 欧美日本二区| 亚洲精品资源美女情侣酒店| 欧美电影美腿模特1979在线看| 在线免费观看欧美| 久久网站热最新地址| 狠狠色丁香久久婷婷综合_中| 欧美在线一二三四区| 国产日韩一区| 欧美在线免费视频| 国产欧美日韩专区发布| 亚洲欧美日韩在线综合| 国产精品色婷婷| 亚洲欧美日本日韩| 国产精品一二三| 亚洲欧美制服另类日韩| 国产精品网站在线| 午夜激情综合网| 国产欧美一区二区精品性| 亚洲欧美中文日韩在线| 国产精品永久在线| 性色av一区二区怡红| 国产日韩精品综合网站| 久久不射电影网| 国语自产精品视频在线看一大j8 | 欧美日韩国产一级片| 日韩午夜免费视频| 欧美日韩精品久久| 在线视频亚洲欧美| 国产精品稀缺呦系列在线| 小黄鸭视频精品导航| 国产亚洲成精品久久| 久久久久一区二区| 亚洲高清久久久| 欧美精品久久久久久久免费观看| 999亚洲国产精| 国产精品大片| 欧美一区二区三区日韩| 好看的日韩av电影| 免费短视频成人日韩| 亚洲精品在线视频| 国产精品www| 久久国产精品高清| 亚洲电影第1页| 欧美日韩hd| 午夜精品视频在线观看一区二区| 国产一区二区三区观看| 欧美1区2区3区| 亚洲午夜精品久久久久久app| 国产欧美三级| 欧美www视频在线观看| 国产精品亚洲综合| 久久免费国产| 日韩午夜在线| 国产精品视频专区| 久久久无码精品亚洲日韩按摩| 亚洲精品国产视频| 国产精品久久久久久久浪潮网站| 久久久久久高潮国产精品视| 亚洲人成网站在线播| 国产精品久在线观看| 久久一区二区三区四区| 夜夜精品视频| 国产一区二区三区高清在线观看| 欧美aa国产视频| 亚洲嫩草精品久久| 亚洲高清在线| 国产精品久久婷婷六月丁香| 久久人人精品| 亚洲午夜羞羞片| 在线成人激情视频| 国产精品theporn| 美女爽到呻吟久久久久| 亚洲小视频在线| 在线精品视频在线观看高清| 欧美午夜精品久久久久久孕妇 | 久久亚洲一区二区三区四区| 一区二区精品在线| 狠狠做深爱婷婷久久综合一区| 欧美区二区三区| 久久精品99无色码中文字幕| 99精品热视频只有精品10| 狠狠爱www人成狠狠爱综合网| 欧美日韩三级一区二区| 久久夜色精品亚洲噜噜国产mv| 亚洲一区二区三区久久| 亚洲国产一区二区精品专区| 国产亚洲va综合人人澡精品| 欧美日韩免费高清一区色橹橹| 久久亚洲精品伦理| 亚洲欧美日韩国产一区二区三区| 91久久国产综合久久| 国产午夜精品久久久久久免费视| 欧美日韩黄色大片| 久久综合久久综合久久综合| 亚洲欧美日韩一区二区在线| 99精品99久久久久久宅男| 亚洲高清视频一区二区| 国产亚洲一区在线| 国产精品久久久久久久久搜平片 | 国产亚洲精品aa| 国产精品激情| 欧美啪啪成人vr| 久久综合五月| 欧美在线黄色| 亚洲欧美日韩精品久久奇米色影视 | 欧美一级在线视频| 亚洲视频一起| 亚洲精品资源美女情侣酒店| 在线精品视频一区二区三四| 国产一区二区三区在线观看免费视频 | 欧美午夜激情小视频| 欧美国产日韩免费| 久热国产精品视频| 久久精品国产一区二区三区| 亚洲欧美美女| 亚洲综合精品四区| 亚洲视频一区| 一区二区三区精密机械公司| 亚洲精品综合精品自拍| 亚洲激情在线播放| 在线成人激情视频| 精品盗摄一区二区三区| 国产曰批免费观看久久久| 国产欧美一区二区三区国产幕精品| 国产精品美女诱惑| 国产精品久久久久一区| 欧美少妇一区二区| 欧美午夜电影在线| 国产精品成人在线| 国产精品久久久久久亚洲调教 | 亚洲激情女人| 亚洲欧洲日韩综合二区| 亚洲国产另类精品专区| 亚洲大片av| 亚洲国产专区| 亚洲精选久久| 夜夜夜久久久| 国产精品99久久久久久久久| 亚洲视频中文|