AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

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

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

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

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

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

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

一、指針變量

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

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

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

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

*(int*)p

這樣上面的程序就可以寫為如下:sg228資訊網(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;}

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

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

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

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

六、函數(shù)指針

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

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

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

下面以一個簡單的例子說明:sg228資訊網(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;}

程序運行結果如下:sg228資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

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

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

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

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

上面是編譯后的匯編指令,可以看到,使用函數(shù)指針來調用函數(shù)時,其匯編指令多了如下:sg228資訊網(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的地址內存中,然后將寄存器esp+0xc地址的值賦值給寄存器eax(累加器),然后調用call指令,此時pc指針將會指向add函數(shù),而0x4015c0正好是函數(shù)add的首地址,這樣就完成了函數(shù)的調用。sg228資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

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

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

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

3. 回調函數(shù)

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

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

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

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

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

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

上一篇: 徹底明白Filter與Interceptor

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

標簽:
  • 熱門焦點
  • JVM優(yōu)化:實戰(zhàn)OutOfMemoryError異常

    一、Java堆溢出堆內存中主要存放對象、數(shù)組等,只要不斷地創(chuàng)建這些對象,并且保證 GC Roots 到對象之間有可達路徑來避免垃 圾收集回收機制清除這些對象,當這些對象所占空間超過
  • 新電商三兄弟,“抖快紅”成團!

    來源:價值研究所作 者:Hernanderz 隨著內容電商的概念興起,抖音、快手、小紅書組成的&ldquo;新電商三兄弟&rdquo;成為業(yè)內一股不可忽視的勢力,給阿里、京東、拼多多帶去了巨大壓
  • 花7萬退貨退款無門:誰在縱容淘寶珠寶商家造假?

    來源:極點商業(yè)作者:楊銘在淘寶購買珠寶玉石后,因為保證金不夠賠付,店鋪關閉,退貨退款難、維權無門的比比皆是。&ldquo;提供相關產(chǎn)品鑒定證書,支持全國復檢,可以30天無理由退換貨。&
  • 當家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己&ldquo;當家&rdquo;的盒馬,開始加速謀生了。據(jù)盒馬官微消息,盒馬計劃今年開放生鮮供應鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經(jīng)與
  • 馮提莫簽約抖音公會 前“斗魚一姐”消失在直播間

    來源:直播觀察提起&ldquo;馮提莫&rdquo;這個名字,很多網(wǎng)友或許聽過,但應該不記得她是哪位主播了。其實,作為曾經(jīng)的&ldquo;斗魚一姐&rdquo;,馮提莫在游戲直播的年代影響力不輸于現(xiàn)
  • 2299元起!iQOO Pad明晚首銷:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發(fā)布會,除了首發(fā)安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發(fā)布會上推出了旗下首款平板電腦——iQOO Pad,其最大的賣點
  • 蘋果MacBook Pro 2021測試:仍不支持平滑滾動

    據(jù)10月30日9to5 Mac 消息報道,蘋果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后獲得了不錯的評價,亮點包括行業(yè)領先的性能,令人印象深刻的電池續(xù)航,精美豐
  • 外交部:美方應停止在網(wǎng)絡安全問題上不負責任地指責他國

      中國外交部今天(16日)舉行例行記者會。會上,有記者問,美國情報官員稱,他們正在阻攔來自中國以及其他國家的黑客獲取相關科研成果。 中方對此有何評論?對此
  • Meta盲目擴張致超萬人被裁,重金押注元宇宙而前景未明

    圖片來源:圖蟲創(chuàng)意日前,Meta創(chuàng)始人兼CEO 馬克&middot;扎克伯發(fā)布公開信,宣布Meta計劃裁員超11000人,占其員工總數(shù)13%。他公開承認了自己的預判失誤:&ldquo;不僅
Top