C語言面試題



尊敬的讀者,這些C語言面試題是專門為了讓您熟悉在C語言面試中可能遇到的問題型別而設計的。根據我的經驗,優秀的 interviewers 很少會在面試前計劃好要問哪些具體問題,通常問題會從該主題的一些基本概念開始,然後根據進一步的討論和您的回答繼續下去。

最常問的100個C語言面試題及答案

這裡列出了100個最常問的C語言面試題及其詳細答案。無論您是應屆畢業生還是經驗豐富的開發者,這些問題都將幫助您準備面試。

什麼是指向指標的指標?

它是一個指標變數,可以儲存另一個指標變數的地址。它進行兩次解引用來指向指定指標變數儲存的資料。

Eg: int x = 5, *p=&x, **q=&p;

因此,可以透過**q訪問'x'。

區分malloc()和calloc()記憶體分配。

兩者都從堆區/動態記憶體分配記憶體。calloc 預設會將分配的記憶體填充為0。

auto關鍵字的作用是什麼?

預設情況下,函式的每個區域性變數都是自動的 (auto)。在下面的函式中,變數'i'和'j'都是自動變數。

void f() {
   int i;
   auto int j;
}

注意 - 全域性變數不能是自動變數。

break關鍵字可以出現在哪些有效位置?

break只能出現在迴圈控制和switch語句中。break 的目的是將控制權從這些塊中帶出來。

解釋for迴圈的語法。

for(expression-1;expression-2;expression-3) {
   //set of statements
}

當控制到達時,首先執行表示式-1。然後是表示式-2,如果表示式-2計算結果為非零,則執行'語句集',然後執行表示式-3,然後再次執行表示式-2。

使用尖括號< >和雙引號" "包含標頭檔案有什麼區別?

如果標頭檔案包含在< >中,則編譯器只在內建包含路徑中搜索特定標頭檔案。如果標頭檔案包含在" "中,則編譯器首先在當前工作目錄中搜索特定標頭檔案,如果找不到,則在內建包含路徑中搜索。

負整數是如何儲存的?

獲取相同正整數的二進位制補碼。例如:1011 (-5)

步驟1 - 5的反碼:1010

步驟2 - 向上加1,得到1011,即-5

什麼是靜態變數?

靜態區域性變數在函式呼叫之間保留其值,預設值為0。如果該函式被呼叫三次,則下面的函式將列印1 2 3。

void f() { 
   static int i; 
   ++i; 
   printf("%d ",i); 
}

如果全域性變數是靜態的,則它的可見性僅限於相同的原始碼。

什麼是NULL指標?

指向空值的指標稱為NULL指標。例如:char *p=NULL;

extern儲存說明符的用途是什麼?

用於解析全域性符號的作用域。

Eg:  
main() {
   extern int i;
   Printf("%d",i);
}
int i = 20;

解釋sprintf()函式的用途。

將格式化的輸出列印到字元陣列中。

陣列的基地址是什麼意思?

陣列的起始地址稱為陣列的基地址。

何時應該使用register儲存說明符?

如果一個變數最頻繁地使用,那麼它應該使用register儲存說明符宣告,然後編譯器可能會為其儲存分配CPU暫存器以加快變數查詢速度。

S++或S = S+1,哪個推薦用於將值加1,為什麼?

S++,因為它內部是單個機器指令(INC)。

什麼是野指標?

一個指標最初持有有效地址,但隨後該地址被釋放或釋放。然後這樣的指標被稱為野指標。

typedef關鍵字的用途是什麼?

它用於為現有型別建立別名。也用於簡化型別的複雜宣告。

什麼是左值和右值?

賦值運算子右側的表示式稱為右值。右值賦給左值,左值出現在賦值運算子的左側。左值應該指定給變數而不是常量。

實際引數和形式引數有什麼區別?

在呼叫端傳送給函式的引數稱為實際引數,而在函式定義的接收端稱為形式引數。

程式可以不帶main()函式編譯嗎?

可以,但是不能執行,因為執行需要main()函式定義。

宣告void指標有什麼好處?

當我們不知道指標變數將儲存哪種型別的記憶體地址時,我們就為此宣告一個void指標。

自動變數儲存在哪裡?

每個區域性變數預設都是自動變數,儲存在堆疊記憶體中。

什麼是巢狀結構體?

包含另一個結構體的元素作為其成員的結構體被稱為巢狀結構體。

變數宣告和變數定義有什麼區別?

宣告將型別與變數關聯起來,而定義為變數賦予值。

什麼是自引用結構體?

包含相同結構體指標變數作為其元素的結構體稱為自引用結構體。

內建標頭檔案是否包含內建函式定義?

不,標頭檔案只宣告函式。定義在庫中,由連結器連結。

解釋模組化程式設計。

將程式劃分為子程式(模組/函式)以實現給定任務是模組化方法。更通用的函式定義賦予了函式重用的能力,例如內建庫函式。

什麼是詞法單元?

C程式由各種詞法單元組成,詞法單元是關鍵字、識別符號、常量、字串文字或符號。

什麼是預處理器?

預處理器是編譯器指令,用於在實際編譯過程開始之前執行某些操作。

解釋關於scanf()的%i格式說明符的用法。

可用於輸入所有受支援格式的整數。

如何使用printf()系列函式中的任何一個列印\(反斜槓)?

使用\(反斜槓)轉義它。

switch語句中的default case是否需要break?

是的,如果它不是最後一個case,並且我們不希望控制流在default之後流向任何後續的case。

何時使用->(箭頭)運算子?

如果結構體/聯合體變數是指標變數,則要訪問結構體/聯合體元素,需要使用箭頭運算子。

什麼是位域?

除了非標準大小外,我們可以使用位域建立不同大小的整型結構成員。這種結構的大小會自動調整為機器整數大小的倍數。

什麼是命令列引數?

在執行程式時傳遞給main()函式的引數稱為命令列引數。這些引數始終是字串,儲存在函式的第二個引數(如下所示的args)中,該引數是字元指標陣列。第一個引數表示引數的數量(如下所示的count),並由作業系統自動更新。

main( int count, char *args[]) {
}

向函式傳遞引數的不同方法有哪些?什麼時候使用哪種方法?

  • 值傳遞 - 我們只將值作為引數傳送給函式。如果我們不希望實際引數被形式引數修改,而只是使用它們,則選擇此方法。

  • 引用傳遞 - 我們傳送實際引數的地址而不是值。如果我們希望實際引數被形式引數修改,則選擇此方法。

內建函式stricmp()的用途是什麼?

它比較兩個字串,忽略大小寫。

描述檔案開啟模式“w+”。

以讀寫方式開啟檔案。如果檔案不存在,則建立一個;如果檔案存在,則將被覆蓋。

地址運算子(&)不能在哪裡使用?

它不能用於常量。

它不能用於使用register儲存類宣告的變數。

FILE是內建資料型別嗎?

不是,它是在stdio.h中定義的結構體。

5.0 % 2的餘數是多少?

錯誤,模運算子(%)的任何一個運算元都不能是實數。

三元運算子類別下有多少個運算子?

只有一個運算子,即條件運算子(? :)。

哪個關鍵字用於執行無條件跳轉?

goto

什麼是指向函式的指標?給出其通用語法。

儲存函式引用的指標稱為指向函式的指標。通常宣告如下。

T (*fun_ptr) (T1,T2…); Where T is any date type.

一旦fun_ptr引用了一個函式,就可以使用該指標呼叫該函式,如下所示。

fun_ptr();
[Or]
(*fun_ptr)();

解釋逗號運算子(,)的用法。

逗號運算子可以用來分隔兩個或多個表示式。

Eg: printf("hi") , printf("Hello");

什麼是空語句?

空語句是沒有可執行語句的語句,例如;(分號)。

Eg: int count = 0; 
while( ++count<=10 ) ;

以上語句什麼也不做,重複10次。

什麼是靜態函式?

在函式定義前加上static關鍵字,稱為靜態函式。如果函式只應在同一個原始碼檔案中呼叫,則應將其宣告為靜態函式。

使用gcc編譯器編譯使用math庫的程式時,應使用哪個編譯器開關?

使用選項 –lm,例如:> gcc –lm <file.c>

哪個運算子用於在下一行繼續宏的定義?

使用反斜槓(\)。

E.g. #define MESSAGE "Hi, \
   
Welcome to C"

哪個運算子用於接收函式的可變數量的引數?

省略號(…)用於此目的。一般的函式定義如下所示

void f(int k,…)  {
}

以下程式碼片段有什麼問題?

char *s1 = "hello",*s2 = "welcome";
   
strcat(s1,s2);

s1指向一個字串常量,不能修改。

哪個內建庫函式可以用來調整已分配的動態記憶體的大小?

realloc().

定義陣列。

陣列是具有相同名稱的相似資料項的集合。

什麼是列舉?

列舉是用名稱表示的整數常量列表。列舉器用關鍵字enum定義。

哪個內建函式可以用來在內部移動檔案指標?

fseek()

什麼是變數?

變數是名稱儲存。

誰設計了C程式語言?

Dennis M. Ritchie。

C是哪種程式語言的繼承者?

B

ANSI的全稱是什麼?

美國國家標準學會 (American National Standards Institute)。

哪個運算子可以用來確定資料型別或變數的大小?

sizeof

可以將浮點型變數賦值給長整型變數嗎?

可以,但會丟失小數部分。

068是有效的八進位制數嗎?

不是,它包含無效的八進位制數字。

如果關係運算符返回任何值,它的返回值是什麼?

如果表示式之間的關係為真,則返回1,否則返回0。

按位異或運算子是如何工作的?

如果對應的位相同,則結果為0,否則為1。

什麼是無限迴圈?

迴圈表示式始終計算為真,從而導致迴圈重複執行,例如:

while(0 == 0) {
}

屬於不同作用域的變數可以具有相同的名稱嗎?如果是,請舉例說明。

屬於不同作用域的變數可以具有相同的名稱,如下面的程式碼片段所示。

int var;
void f() { 
   int var; 
}
main() { 
   int var; 
}

區域性變數和全域性變數的預設值是什麼?

區域性變數獲得垃圾值,全域性變數預設值為0。

指標可以訪問陣列嗎?

指標透過儲存陣列的基地址可以訪問陣列。

指標上有哪些有效的運算?

指標上僅允許的兩個運算為:

  • 比較
  • 加法/減法(不包括空指標)

什麼是字串長度?

它是字元的數量,不包括‘\0’字元。

哪個內建函式可以將一個字串附加到另一個字串?

strcat(),來自標頭檔案string.h

如果聯合變數是指標變數,可以使用哪個運算子訪問聯合元素?

箭頭 (->) 運算子。

解釋“stdin”。

stdin 是一個指標變數,預設情況下開啟標準輸入裝置。

命名一個可以用來關閉檔案流的函式。

fclose()。

預處理器#undef的用途是什麼?

它用於取消已存在的宏定義。

定義結構體。

可以定義一個包含異構資料項集合的結構體。

命名一個預定義的宏,用於確定編譯器是否符合ANSI標準?

__STDC__

什麼是型別轉換?

型別轉換是將變數/常量從一種型別轉換為另一種型別的方法。

什麼是遞迴?

函式自己呼叫自己稱為遞迴。

哪個函式可以用來釋放動態分配的記憶體?

free()。

關於命令列引數,引數向量中的第一個字串是什麼?

程式名稱。

如何使用fopen()函式確定檔案是否已成功開啟?

如果失敗,fopen()返回NULL,否則表示成功開啟。

連結器生成的輸出檔案是什麼?

連結器生成可執行檔案。

識別符號的最大長度是多少?

理想情況下是32個字元,也取決於實現。

預設的函式呼叫方法是什麼?

預設情況下,函式按值呼叫。

函式必須宣告,也應該宣告。對此發表評論。

如果在函式定義後呼叫函式,則函式宣告是可選的。

宏何時展開?

在預處理階段。

函式可以使用return保留字向呼叫者返回多個值嗎?

不能,只能向呼叫者返回一個值。

什麼是常量指標?

不允許在指標持有地址後更改其地址的指標。

要使指標對哪種資料型別具有通用性,需要如何宣告它?

void

結構體變數可以在宣告時立即初始化嗎?

可以,僅限於結構體元素的順序。

有沒有辦法比較兩個結構體變數?

沒有這種方法。我們需要逐個比較結構體變數的元素。

哪個內建庫函式可以用來從字串中匹配模式?

strstr()

遠指標和近指標有什麼區別?

首先,它們是非標準關鍵字。近指標只能訪問2^15個記憶體空間,而遠指標可以訪問2^32個記憶體空間。這兩個關鍵字都是實現特定的,是非標準的。

我們可以在C程式碼中巢狀註釋嗎?

不能。

如果必須執行一組語句固定次數,建議使用哪個控制迴圈?

for迴圈。

什麼是常量?

不能修改的值稱為常量。此類變數用關鍵字const限定。

我們可以只使用結構體的標籤名來宣告相同的變數嗎?

不可以,我們需要同時使用關鍵字'struct'和標籤名。

main()函式可以留空嗎?

可以,程式可能什麼也不做。

一個函式可以呼叫另一個函式嗎?

可以,任何使用者定義的函式都可以呼叫任何函式。

除了Dennis Ritchie,還有誰參與了C語言的設計?

Brian Kernighan

接下來是什麼?

接下來,你可以回顧一下你之前在這個科目上完成的作業,確保你能自信地談論它們。如果你剛畢業,面試官不會期望你回答非常複雜的問題,而是要確保你的基礎概念非常紮實。

其次,如果你無法回答一些問題,其實並不重要,重要的是你回答的任何問題都必須充滿自信。所以在面試時要自信。Tutorialspoint祝你找到一位好的面試官,並祝你未來的努力一切順利!乾杯 :-)

cprogramming_questions_answers.htm
廣告