關鍵字static的作用是什麼?
1)在模組內(在函式內),則此靜態變數只能在該函式內使用,超出範圍不能使用,但是它還占用記憶體,還存在。
2)在模組內(但在函式體外),乙個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問,它是乙個本地的全域性變數。
3)在模組內,乙個被宣告為靜態的函式只可被這一模組內的其它函式呼叫。那就是,這個函式被限制在宣告它的模組的本地範圍內使用。
關鍵字const有什麼含義?
1)唯讀;
2)能產生更緊湊的**;
3)使編譯器很自然的保護那些不希望被更改的引數,防止其被無意義的**修改。
說明以下const宣告的變數的意思
1)const int a;
2)int const a;
3)const int* a;
4)int* const a;
5)int const* a const;
註解:1)和 2)a都是乙個唯讀的常整型數;
3)意味著 a 是乙個指向常整型數的指標(也就是整型數是不可修改的,指標可以);
4)意味著 a 是乙個指向整型數的常指標(也就是整型數是可修改的,指標不可以);
5)意味著 a 是乙個指向常整型數的常指標(也就是整型數是不可修改的,指標也不可以)。
關鍵字volatile有什麼含意?並給出三個不同的例子
乙個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。
下面是volatile變數的幾個例子:
1)並行裝置的硬體暫存器(如:狀態暫存器)
2)乙個中斷服務子程式中會訪問到的非自動變數(non-automatic variables) :
3)多執行緒應用中被幾個任務共享的變數。
引申題:
1)乙個引數既可以是const還可以是volatile嗎?
是的。乙個例子是唯讀的狀態暫存器。它是volatile因為它可能被意想不到地改變。它是const因為程式不應該試圖去修改它。
2)乙個指標可以是volatile 嗎?
是的。儘管這並不很常見。乙個例子是當乙個中斷服務子程式修改乙個指向乙個buffer的指標時。
3)下面的函式有什麼錯誤:
int square(volatile int *ptr)
這段**有點**。這段**的目的是用來返回指標*ptr指向值的平方,但是,由於*ptr指向乙個volatile型引數,編譯器將產生類似下面的**:
int square(volatile int *ptr)
由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段**可能返不是你所期望的平方值!正確的**如下:
long square(volatile int *ptr)
全域性變數和區域性變數有什麼區別?是怎麼實現的?作業系統和編譯器是怎麼知道的?
答:全域性變數的生命週期是整個程式執行的時間,而區域性變數的生命週期則是區域性函式或過程呼叫的
時間段。其實現是由編譯器在編譯時採用不同記憶體分配方法。
全域性變數在main函式呼叫後,就開始分配,
靜態變數則是在main函式前就已經初始化了。
區域性變數則是在使用者棧中動態分配的
c語言學習篇
c語言 編譯 執行c程式 include intmain 1.了解c語言結構 main 主函式,所有c語言程式都要包含主函式,從main 函式開始執行 include 是乙個預處理的命令,用來引入標頭檔案 stdio.h 是乙個標頭檔案 標準輸入輸出標頭檔案 printf 格式化輸出到螢幕。prin...
C語言學習 函式篇
函式需要前置,因為系統會預設主函式先執行。為什麼使用函式 避免重複性操作。提高程式可讀性,方便後期修改和完善。有利於程式的模組化。函式類似於乙個黑盒子,有時候不需要知道裡面你怎麼執行的,知道如何用就好了。函式形參用完之後記憶體空間會被釋放,void表示沒有返回值。函式是c語言的基本單位。什麼是函式 ...
C語言學習篇(程式類)
用預處理指令 define 宣告乙個常數,用以表明1年中有多少秒 忽略閏年問題 define seconds per year 60 60 24 365 ul註解 1 define 語法的基本知識 例如 不能以分號結束,括號的使用,等等 2 直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是...