static volatile 0 註冊函式

2021-09-02 17:56:49 字數 2159 閱讀 4591

1)在函式體,乙個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。

2) 在模組內(但在函式體外),乙個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問。它是乙個本地的全域性變數。

在模組內,乙個被宣告為靜態的函式只可被這一模組內的其它函式呼叫。那就是,這個函式被限制在宣告它的模組的本地範圍內使用。

來自 volatile提醒編譯器它後面所定義的變數隨時都有可能改變,因此編譯後的程式每次需要儲存或讀取這個變數的時候,都會直接從變數位址中讀取資料。如果沒有volatile關鍵字,則編譯器可能優化讀取和儲存,可能暫時使用暫存器中的值,如果這個變數由別的程式更新了的話,將出現不一致的現象。下面舉例說明。在dsp開發中,經常需要等待某個事件的觸發,所以經常會寫出這樣的程式:

short flag;

void test()

這段程式等待記憶體變數flag的值變為1(懷疑此處是0,有點疑問,)之後才執行do2()。變數flag的值由別的程式更改,這個程式可能是某個硬體中斷服務程式。例如:如果某個按鈕按下的話,就會對dsp產生中斷,在按鍵中斷程式中修改flag為1,這樣上面的程式就能夠得以繼續執行。但是,編譯器並不知道flag的值會被別的程式修改,因此在它進行優化的時候,可能會把flag的值先讀入某個暫存器,然後等待那個暫存器變為1。如果不幸進行了這樣的優化,那麼while迴圈就變成了死迴圈,因為暫存器的內容不可能被中斷服務程式修改。為了讓程式每次都讀取真正flag變數的值,就需要定義為如下形式:

volatile short flag;

'\0』的問題

對字元陣列,有以下幾種定義方法:

char str="12345";

或給字串加上大括號:char str=;

這種方法定義時,系統會自動在字串的末尾加上字串結束符,即 『\0』,

char str[10]=;

這種方法定義時,系統會自動從未初始化的元素開始,將之後的元素賦為\0,如上面的陣列str中的元素實際上是:『1』,『2』,『3』,『4』,『5』,』\0』,』\0』,』\0』,』\0』,』\0』

char str=;

這種方法定義時,系統不會自動在字串的末尾加上字串結束符;

此時用sizeof()函式可以正確求出其所佔的記憶體大小;但用strlen()函式不能正確求出其長度,因為strlen是通過\0判斷字串結束的。

所以,採用該方法定義時,一般人為地加上\0,即char str=;

易錯情況:

1、char a[10]; a[10]=「hello」;//乙個字元怎麼能容納乙個字串?況且a[10]也是不存在的!

2、char a[10]; a=「hello」;//這種情況容易出現,a雖然是指標,但是它已經指向在堆疊中分配的10個字元空間,現在這個情況a又指向資料區中的hello常量,這裡的指標a出現混亂,不允許!

還有:不能使用關係運算子「==」來比較兩個字串,只能用strcmp() 函式來處理。

補充:用字元指標定義時:

只能採用字串的方式初始化:char *str3="12345";

注意:字元指標可以用字串常量初始化和賦值;

即:char *str3;str3=「12345」;也是可以的

此時也可以用str3[4]的形式訪問其中的元素,如cout<< str3[4];就會輸出str指向的字串的第四個元素。

該方法也是自動加上了字串結束符的。

//1

typedef void (*pfunc)(void);

void sys_setcallbackparmdownfunc(pfunc pf)

if(pcallbackparmdownfunc != null)

//2 void (*pfnbrdpoll)(void);//void (*pfnbrdpoll)(char);

pfnbrdpoll = hal_board_poll;

void hal_board_poll(void)

if (pfnbrdpoll)\

pfnbrdpoll();//if (pfnbrdmsgdeal)

//pfnbrdmsgdeal(msg);

字元0 數字0和 0

binoct dechex 縮寫 字元 解釋0000 000000 00nut null 空字元00110000 6048300 字元0ascii碼值 0 表示空字元,空字元就是平時所說的 0 字元 0 ascii碼值為 48,如 012 字串中的 0 表示字元 0 數字 0,所說的數字 0,就是平...

C語言 0 和0和 0

共同點 都是字元 不同點 0 對應的ascii碼是0,是ascii碼表中的第乙個字元,即空字元 判斷乙個字串是否結束的標誌就是看是否遇到 0 0 對應的ascii碼是48,48對應的十六進製制數就是0x30。0 是字串常量,字串常量是由一對雙引號括起的字串行。字串常量可以含乙個或多個字元。0 是字元...

徹底搞定0x0d和0x0a

我只在arm linux c和vc 下做了試驗,請大家在接觸其它語言環境下,小心推廣,不行就自己動手做試驗,最可靠。在arm linux c和vc 下回車換行的意義如下。回車 cr ascii碼 r 十六進製制,0x0d,回車的作用只是移動游標至該行的起始位置 換行 lf ascii碼 n 十六進製...