您的位置:首頁>正文

C語言面試題之基礎篇,你又知道多少?是不是感覺自己C語言白學了?

學習交流,請少俠駐足:C/C++學習交流 8群 491994603

區域變數能否和全域變數重名? (華為)

解析:能, 局部會遮罩全域。 要用全域變數, 需要使用"::"

區域變數可以與全域變數同名,

在函數內引用這個變數時, 會用到同名的區域變數,

而不會用到全域變數。 對於有些編譯器而言, 在同一個函數內可以定義多個同名的區域變數.

比如在兩個循環體內都定義一個同名的區域變數, 而那個區域變數的作用域就在那個循環體內。

3. 如何引用一個已經定義過的全域變數? (華為)

解析:extern

可以用引用標頭檔的方式, 也可以用extern關鍵字, 如果用引用標頭檔方式來引用某個在標頭檔中

聲明的全域變理, 假定你將那個編寫錯了, 那麼在編譯期間會報錯, 如果你用extern方式引用時,

假定你犯了同樣的錯誤, 那麼在編譯期間不會報錯, 而在連接期間報錯。

4. static全域變數與普通的全域變數有什麼區別?

解析:1) 全域變數(外部變數)的說明之前再冠以static 就構成了靜態的全域變數。

全域變數本身就是靜態存儲方式, 靜態全域變數當然也是靜態存儲方式

從以上分析可以看出,

static全域變數與普通的全域變數有什麼區別:

static全域變數只初使化一次, 防止在其他檔單元中被引用;

static區域變數和普通區域變數有什麼區別:

static區域變數只被初始化一次, 下一次依據上一次結果值; static函數與普通函數有什麼區別:

static函數在記憶體中只有一份, 普通函數在每個被調用中維持一份拷貝

學習交流,請少俠駐足:C/C++學習交流 8群 491994603

5. 進程和執行緒的差別(微軟亞洲)

解析:答:執行緒是指進程內的一個執行單元,也是進程內的可調度實體. 與進程的區別:

(1)調度:執行緒作為調度和分配的基本單位, 進程作為擁有資源的基本單位

(2)併發性:不僅進程之間可以併發執行, 同一個進程的多個執行緒之間也可併發執行

(3)擁有資源:進程是擁有資源的獨立單位, 執行緒不擁有系統資源, 但可以訪問隸屬于進程的資源.

(4)系統開銷:在創建或撤銷進程時, 由於系統都要為之分配和回收資源, 導致系統的開銷明顯大於創建或撤銷執行緒時的開銷

學習交流,請少俠駐足:C/C++學習交流 8群 491994603

6. 用巨集定義寫出swap(x, y)(思科)

解析:#define swap(x, y) x = x + y; y = x - y; x = x - y

7. 什麼是預編譯, 何時需要預編譯:(思科)

解析:就是指程式執行前的一些預處理工作,主要指#表示的. 何時需要預編譯?

1)、總是使用不經常改動的大型代碼體。

2)、程式由多個模組組成, 所有模組都使用一組標準的包含檔和相同的編譯選項。

在這種情況下, 可以將所有包含檔預編譯為一個預編譯頭。

8. 下述三個有什麼區別?char * const p;char const * p, const char *p; (慧通)

解:const char* p和char const *p修飾的是p所指向的變數,

不可以用*p=’a’等這樣的方式修改變數區的內容. 指標本身是可以修改的, 比如說

char x,y; const *p = &x, p = &y, 修改指標本身是可以的,*p = ‘b’就不行。

Char *const p;中const修飾的是指標, 表明指標在操作過程中不可以修改,

而指標所指向的內容是可以修改的, 比如說char x ,y; char* const p = &x; *p = ‘b’是可以的,

但p=&y;是不可以的, const修飾的是指標, 不可以修改指標的指向,

只可以修改指標所捆綁的變數

學習交流,請少俠駐足:C/C++學習交流 8群 491994603

9. int (*s[10])(int) 表示的是什麼啊 ? (慧通)

解析:這樣的運算式可以遵循這樣的規則:從右向左,由近及遠,括弧優先;

比如:從a符號開始。其右邊是[10],說明a是個陣列,其中存了十個元素。

再看a的左邊是一個*。說明陣列中存的是指標。

現在在看(*a[10])的右邊是(int);說明所存的指標是指向有一個int形參的函數

現在看(*a[10])的左邊是個int ,說明指向的函數的返回值為int 類型;

10. 進程之間通信的途徑,進程間通信方法(慧通)

解析:無名管道,具名管道,訊息佇列,信號,共用記憶體,通訊端。等

11. 什麼是“引用”?申明和使用“引用”要注意哪些問題?

解析:引用就是某個目標變數的“別名”(alias),對應用的操作與對變數直接操作效果完全相同。申明一個引用的時候,切記要對其進行初始化。引用聲明完畢後,相當於目標變數名有兩個名稱,即該目標原名稱和引用名,不能再把該引用名作為其他變數名的別名。聲明一個引用,不是新定義了一個變數,它只表示該引用名是目標變數名的一個別名,它本身不是一種資料類型,因此引用本身不占存儲單元,系統也不給引用分配存儲單元。不能建立陣列的引用

12.include 和include “filename.h”的區別?

解析:<>是從標準庫路徑搜索,

“”是從使用者當前工作目錄開始,找不到,在到標準庫開始

13.Heap和Stack的區別?

解析:Heap是堆,Stack是棧。

棧的空間由作業系統自動分配和回收,而堆上的空間由程式師申請和釋放。

棧的空間大小較小,而堆的空間較大。

棧的位址空間往低位址方向生長,而堆向高位址方向生長。

棧的存取效率更高。

程式在編譯期間對變數和函數的記憶體分配都在棧上,

且程式運行過程中對函式呼叫中參數的記憶體分配也是在棧上。

14.sizeof和strlen之間的區別?

解析:(1)sizeof操作符的結果類型是size_t,它在標頭檔中的typedef為

unsigned int類型,該類型保證能容納實現所建立的最大物件的位元組大小。

(2)sizeof是運算子,strlen是函數

(3)sizeof可以用類型做參數,strlen只能用char *做參數,

且必須是以’

學習交流,請少俠駐足:C/C++學習交流 8群 491994603

9. int (*s[10])(int) 表示的是什麼啊 ? (慧通)

解析:這樣的運算式可以遵循這樣的規則:從右向左,由近及遠,括弧優先;

比如:從a符號開始。其右邊是[10],說明a是個陣列,其中存了十個元素。

再看a的左邊是一個*。說明陣列中存的是指標。

現在在看(*a[10])的右邊是(int);說明所存的指標是指向有一個int形參的函數

現在看(*a[10])的左邊是個int ,說明指向的函數的返回值為int 類型;

10. 進程之間通信的途徑,進程間通信方法(慧通)

解析:無名管道,具名管道,訊息佇列,信號,共用記憶體,通訊端。等

11. 什麼是“引用”?申明和使用“引用”要注意哪些問題?

解析:引用就是某個目標變數的“別名”(alias),對應用的操作與對變數直接操作效果完全相同。申明一個引用的時候,切記要對其進行初始化。引用聲明完畢後,相當於目標變數名有兩個名稱,即該目標原名稱和引用名,不能再把該引用名作為其他變數名的別名。聲明一個引用,不是新定義了一個變數,它只表示該引用名是目標變數名的一個別名,它本身不是一種資料類型,因此引用本身不占存儲單元,系統也不給引用分配存儲單元。不能建立陣列的引用

12.include 和include “filename.h”的區別?

解析:<>是從標準庫路徑搜索,

“”是從使用者當前工作目錄開始,找不到,在到標準庫開始

13.Heap和Stack的區別?

解析:Heap是堆,Stack是棧。

棧的空間由作業系統自動分配和回收,而堆上的空間由程式師申請和釋放。

棧的空間大小較小,而堆的空間較大。

棧的位址空間往低位址方向生長,而堆向高位址方向生長。

棧的存取效率更高。

程式在編譯期間對變數和函數的記憶體分配都在棧上,

且程式運行過程中對函式呼叫中參數的記憶體分配也是在棧上。

14.sizeof和strlen之間的區別?

解析:(1)sizeof操作符的結果類型是size_t,它在標頭檔中的typedef為

unsigned int類型,該類型保證能容納實現所建立的最大物件的位元組大小。

(2)sizeof是運算子,strlen是函數

(3)sizeof可以用類型做參數,strlen只能用char *做參數,

且必須是以’

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示