我的部分面試筆試題 C語言

2021-09-29 09:10:37 字數 3755 閱讀 5924

volatile

表示乙個變數也許會被後台程式改變,關鍵字 volatile 是與 const 絕對對立的。它指示乙個變數也許會被某種方式修改,這種方式按照正常程式流程分析是無法預知的(例如,乙個變數也許會被乙個中斷服務程式所修改)。這個關鍵字使用下列語法定義

volatile data-definition;
變數如果加了 volatile 修飾,則會從記憶體重新裝載內容,而不是直接從暫存器拷貝內容。

volatile 的作用是作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。

詳情請見

const

區域性變數儲存在棧中,靜態變數儲存在靜態儲存區中,而經過 const 修飾過的變數儲存在記憶體中的「唯讀資料段」中。唯讀資料段中存放著常量和唯讀變數等不可修改的量。

關鍵字const用來定義常量,如果乙個變數被const修飾,那麼它的值就不能再被改變。

與預編譯指令相比,const修飾符有以下的優點

1、預編譯指令只是對值進行簡單的替換,不能進行型別檢查

2、可以保護被修飾的東西,防止意外修改,增強程式的健壯性

3、編譯器通常不為普通const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率也很高。

參考:參考鏈結

參考鏈結

extern

extern關鍵字宣告變數和函式作為外部變數或者函式供其它檔案使用。

static

static作用:「改變生命週期」 或者 「改變作用域」

程式的區域性變數存在於(堆疊)中,全域性變數存在於(靜態區 )中,動態申請資料存在於( 堆)中。

用static宣告區域性變數,使其變為靜態儲存方式(靜態資料區),作用域不變;用static宣告外部變數,其本身就是靜態變數,這只會改變其連線方式,使其只在本檔案內部有效,而其他檔案不可連線或引用該變數。

使用static用於函式定義時,對函式的連線方式產生影響,使得函式只在本檔案內部有效,對其他檔案是不可見的。這樣的函式又叫作靜態函式。使用靜態函式的好處是,不用擔心與其他檔案的同名函式產生干擾,另外也是對函式本身的一種保護機制

詳細參考:

heap和stack的區別

儲存 stack->變數,引用 heap ->例項物件

速度: stack 訪問速度快 heap 訪問速度慢

大小: stack的空間小 heap的空間大

執行緒訪問:stack->每個執行緒都有乙個棧

heap ->所有執行緒共享乙個棧

堆區(heap):一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時可能由作業系統**,但它與資料結構中的堆不是一回事,分配方式類似於鍊錶。

棧(stack):由編譯器自動分配和釋放,存函式的引數值,區域性變數等,其操作方式類似於資料結構中的棧。

全域性區(靜態區)(static):全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域,程式結束後由系統釋放。

文字常量區:存放常量字串,程式結束後由系統釋放。

程式**區:存放函式的二進位制**。

參考文章

char *p1;

int *p2;

struct st

;struct st* p3;

p1 = (char*) 0x8000000;

p2= (int*) 0x8000000;

p3 = (struct st*)0x8000000;

請問 p1+2=?; p2+2=?; p3+2=?

char為1byte,int為4byte,結構體為5byte
#include int main (void) 

10 12 120
#includeint main(int argc, char*ar**)

if(flag)

else

return 0;

}

在執行時發生錯誤產生中斷,位置在strcpy()函式處理過程中,原因與記憶體分配有關;
#includeint main(int argc, char *ar**)else if(argc == 1) else 

if(*ptr = 'z')

free(ptr);

} return 0;

}

用vs編譯的時候會有空字元常量的錯誤,發生在if(*ptr =='') break;

未執行原因待解決(可能是題目本身有問題)

void fun(void) 

int main(void)

函式中的fun(void)://不允許使用型別名
#includeint main(void)
#includeint* inc(int val)

int main(void)

emmm
#includeint main(void)
60..40..60
void swap(int *a,int *b)

void main(int *arr, int len)

}}

另一種方法

void bubble_sort(int *arr, int len)}}

給定字串「abc」輸出「cba」

#includevoid reverse(char *p)

int main()

解答:

堆:先進先出;棧:後進後出

在微控制器應用中,堆疊是乙個特定的儲存區或暫存器,主要功能是暫時存放資料和位址,通常用來保護斷點和現場。它的一端固定,另一端浮動。在這個儲存區存入資料有一種特殊的資料結構。所有的資料存入或取出,只能在浮動的一端(稱棧頂)進行,嚴格按照「先進後出」的原則訪問,位於其中間的元素,必須在其棧上部(後進棧者)諸元素逐個移出後才能取出。在記憶體儲器(隨機儲存器)中開闢乙個區域作為堆疊,叫軟體堆疊;用暫存器構成的堆疊,叫硬體堆疊。

解答:在rs232中任何一條訊號線的電壓均為負邏輯關係。即:邏輯「1」為-3到-15v;邏輯「0」為+3到+15v。

在rs485中採用差分訊號負邏輯。邏輯"1」以兩線間的電壓差為 - (2 ~ 6)v表示;

邏輯"0"以兩線間的電壓差為+(2 ~ 6)v表示。相容ttl電平。

在ttl中電平訊號採用二進位制,+5v等價於邏輯「1」,0v等價於邏輯「0」。

rs485與rs232類似,但是採用差分訊號邏輯,更適合長距離、高速傳輸,最高傳輸速率為10mbps。

相同點:rs232、rs485、ttl都是指電平標準(電訊號)

C 面試筆試題

看一下這是一些c 面試的筆試,對於學習c 的你也許也是個考驗吧,有時間做做吧 給定九個數,例如 1,3,3,5,6,7,8,8,9計算出這九個數的排列的種數。需要考慮重複情況,如果給定9個1,則只有一種結果。限制 不能使用stl庫 要求 完成函式 unsigned int foo unsigned ...

面試筆試題

1 昨天參加一公司筆試,給幾道演算法題整懵了,其實也不難,但好久沒有碰演算法,只是有思路,要讓我在這麼短的時間內寫出程式來還是不行。2 這裡將其中一道稍微複雜一點的演算法題寫下來,以此小結。3 4 題目描述 5 將n個雞蛋放入到m個籃子中去 n m 保證每個籃子中至少乙個雞蛋,然後指定乙個數x,要求...

面試筆試題

1.文字檔案裡面有很多單詞 單詞與單詞之間以空格 換行符隔開,且不管單個單詞的正確性 統計各單詞出現的次數,刪掉出現次數最少的那些 實現 fstream讀入事先準備好的檔案test.txt,存到c 的關聯容器map,用單詞string做key,出現的次數int做value,找到最小的value,然後...