
- C語言教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境搭建
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整數提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof 運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策
- C語言 - 決策
- C語言 - if 語句
- C語言 - if...else 語句
- C語言 - 巢狀 if 語句
- C語言 - switch 語句
- C語言 - 巢狀 switch 語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while 迴圈
- C語言 - for 迴圈
- C語言 - do...while 迴圈
- C語言 - 巢狀迴圈
- C語言 - 死迴圈
- C語言 - break 語句
- C語言 - continue 語句
- C語言 - goto 語句
- C語言中的函式
- C語言 - 函式
- C語言 - 主函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 可變引數函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - return 語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 將陣列傳遞給函式
- C語言 - 從函式返回陣列
- C語言 - 變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指向指標的指標
- C語言 - 將指標傳遞給函式
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列的區別
- C語言 - 字元指標和函式
- C語言 - NULL 指標
- C語言 - void 指標
- C語言 - 野指標
- C語言 - 解引用指標
- C語言 - 近指標、遠指標和巨大指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列的區別
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言中的結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點 (.) 運算子
- C語言 - 列舉 (enum)
- C語言 - 結構體填充和壓縮
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - typedef
- C語言中的檔案處理
- C語言 - 輸入 & 輸出
- C語言 - 檔案I/O (檔案處理)
- C語言預處理器
- C語言 - 預處理器
- C語言 - 預處理指令
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static 關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C語言資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
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祝你找到一位好的面試官,並祝你未來的努力一切順利!乾杯 :-)