C語言面試最常問的關鍵字

2023-07-11 15:20:42 來源:嵌入式老林

大家好,我是嵌入式老林,從事嵌入式軟件開發多年,今天分享的內容是C語言面試最常問的三個關鍵字,希望能對你有所幫助。

C語言面試最常問的關鍵字

一,static關鍵字的作用

a) 修飾局部變量,會改變局部變量的生命周期,不改變作用域(在函數執行完后,該靜態局部變量還在,不會被釋放,但不能在其它地方使用);靜態局部變量的初始化只會執行一次

b) 修飾全局變量,表示該全局變量只能在本文件使用,不能跨文件使用


(資料圖片)

c) 修飾函數,表示該函數只能在本文件中使用,不能跨文件使用

static修飾的變量存放在靜態存儲區,會默認初始化為0,而且修飾的全局變量和函數只能在本文件中使用,可防止重名。

二,const 關鍵字的作用

const 是 constant 的縮寫,意思是“恒定不變的”!用來定義只讀變量的,或者說 const 是定義常量的關鍵字

2.1, 修飾局部變量,被修飾變量的值不能改變。用const修飾變量時,一定要給變量初始化,否則之后就不能再進行賦值了。

const int i = 10;        //正確int const i = 10        // 正確,這兩種寫法是等價的i = 20;                //錯誤,常量值不可被改變const int j;          //錯誤,未被初始化

2.2, 修飾指針,可以指定指針本身為const,也可以指定指針所指的數據為const

常量指針,本質上是個指針,指針指向的內容是常量,指針本身是可以變的,可指向其他地址

int a = 5;int b = 10;const int* n = &a;int const* n = &a;  //這兩種定義方式都是一樣的,表示常量指針*n = 6;  //錯誤,不能改變 n所指向對象的值a = 6;  //正確,不能通過這個指針改變變量的值,但是還是可以通過其他的引用來改變變量的值的。n = &b;  //正確,常量指針指向的指不能改變,但指針可變,可指向其他地址

指針常量,本質上是個常量,表示常量是個指針類型,不能再指向其他的地址,指向的內容可變

int nValue1 = 10;int nValue2 = 20;int* const constPoint = &nValue1;//constPoint = & nValue2;  //錯誤,不能改變constPoint本身的值*constPoint = 40;  //正確,可以改變constPoint所指向的對象,此時nValue1 = 40

指向常量的常指針

是以上兩種的結合,指針指向的位置不能改變并且也不能通過這個指針改變變量的值,但是依然可以通過其他的普通指針改變變量的值。

const int nConstValue1 = 5;const int nConstValue2 = 15;const int* const pPoint = &nConstValue1;//*pPoint  = 55;  //錯誤,不能改變pPoint所指向對象的值//pPoint = &nConstValue2;  //錯誤,不能改變pPoint本身的值

const助記方法

把一個聲明從右向左讀。( * 讀成 pointer to )
char * const cp;  // cp is a const pointer to charconst char * p;   // p is a pointer to const char;char const * p;   // 同上

2.3, 修飾函數形參

根據常量指針與指針常量,const修飾函數的參數也是分為三種情況

a)防止修改指針指向的內容

void StringCopy(char* strDes, const char* strSrc);

其中 strSrc是輸入參數,strDes是輸出參數。給 strSrc 加上 const 修飾后,如果函數體內的語句試圖改動 strSrc 的內容,編譯器將指出錯誤。

b) 防止修改指針指向的地址

void swap ( int* const p1 , int* const p2 )

指針p1和指針p2指向的地址都不能修改。

c) 以上兩種的結合。

void swap ( int* const p1 , const int* const p2 )

2.4,修飾函數的返回值

如果給以“指針傳遞”方式的函數返回值加 const 修飾,那么函數返回值(即指針)的內容不能被修改,該返回值只能被賦給加const 修飾的同類型指針。

舉個例子:

const char* GetString(void);char* str = GetString(); // 錯誤,會出現編譯錯誤const char* str = GetString();  // 正確,類型要一致

三,volatile關鍵字的作用

volatile 本意是“易變的”,指變量是隨時可能發生變化的。系統總是重新從它所在的內存讀取數據,即使它前面的指令剛剛從該處讀取過數據。即變量前加這個關鍵字,編譯器對訪問該變量的代碼就不再進行優化,從而可以提供對特殊地址的穩定訪問

a) 存儲器映射的硬件寄存器

b) 一個中斷服務程序中修改的供其它程序檢測的變量

c) 多線程中各任務間共享的變量,可以關閉系統調度

這幾種情況經常還要同時考慮數據的完整性(相互關聯的幾個標志讀了一半被打斷了重寫),在a)中只能依靠硬件的良好設計,b)中可以通過關中斷來實現,c)中禁止任務調度。

編譯器的優化:

在本次線程內, 當讀取一個變量時,為提高存取速度,編譯器優化時有時會先把變量讀取到一個寄存器中;以后,再取變量值時,就直接從寄存器中取值;當變量值在本線程里改變時,會同時把變量的新值copy到該寄存器中,以便保持一致。

當變量在因別的線程等而改變了值,該寄存器的值不會相應改變,從而造成應用程序讀取的值和實際的變量值不一致。

當該寄存器在因別的線程等而改變了值,原變量的值不會改變,從而造成應用程序讀取的值和實際的變量值不一致。

其他問題

1)一個參數既可以是const還可以是volatile嗎?

可以的,例如只讀的狀態寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應該試圖去修改它。

2)一個指針可以是volatile 嗎?

可以,當一個中服務子程序修該一個指向一個buffer的指針時。

標簽:

上一篇:基于離散域下設計的PI電流調節器
下一篇:最后一頁