C語言學習篇(概念題)

2021-09-19 13:40:40 字數 1634 閱讀 4876

關鍵字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 直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是...