面試題目總結

2021-05-23 03:10:40 字數 3316 閱讀 3747

1. char p和char *p的區別。

(1)char *getstring(void)

void main()

(2)char *getstring(void)

void main()

為什麼(1)輸出的是亂碼,(2)能夠輸出 hello world?

"hello world"作為靜態字串實際上儲存在文字常量區[參見:棧和堆的區別],但寫程式的人不知道這個位址,而程式本身知道。當某一函式以 方式使用此靜態字串時,實際上相當於:

char p[12];

strcpy(p, "hello world");

p[12]是在棧裡臨時分配的。雖然p指向的內容是"hello world", 但是這是複製品,不是原件。當函式結束,char p就被程式**了,所以p的內容就不再是"hello world"了。

但如果以char *p="hello world"的方式使用,p指向的是靜態字串儲存的位置,也就是說指向"hello world"的原件,當然沒有問題了。(注意此種形式不能在程式中修改字串。)

通過單步除錯可以看到兩者的區別。

2.malloc和calloc的區別。

void* malloc(unsigned size);

void* calloc(size_t nelem, size_t elsize);

void* realloc(void* ptr, unsigned newsize);

三個函式都在stdlib.h函式庫內,是c語言的標準記憶體分配函式。

1. 函式malloc()和calloc()都可以用來動態分配記憶體空間。

malloc()函式有乙個引數,即要分配的記憶體空間的大小,malloc 在分配記憶體時會保留一定的空間用來記錄分配情況,分配的次數越多,這些記錄占用的空間就越多。另外,根據 malloc 實現策略的不同,malloc 每次在分配的時候,可能分配的空間比實際要求的多些,多次分配會導致更多的這種浪費。當然,這些都和 malloc 的實現有關;calloc()函式有兩個引數,分別為元素的數目和每個元素的大小,這兩個引數的乘積就是要分配的記憶體空間的大小。如果呼叫成功,它們都將返回所分配記憶體空間的首位址。

2. 函式malloc()和函式calloc()的主要區別是前者不能初始化所分配的記憶體空間,而後者能。

3. realloc可以對給定的指標所指的空間進行擴大或者縮小,無論是擴張或是縮小,原有記憶體的中內容將保持不變。當然,對於縮小,則被縮小的那一部分的內容會丟失。

4. realloc 並不保證調整後的記憶體空間和原來的記憶體空間保持同一記憶體位址。相反,realloc 返回的指標很可能指向乙個新的位址。所以在**中,我們必須將realloc返回的值,重新賦值給 p :

p = (int *) realloc (p, sizeof(int) *15);

3 c語言巨集定義的高階應用

關於#和##在c語言的巨集中的應用

1.#的功能是將其後面的巨集引數進行字串化操作(stringfication),簡單說就是在對它所引用的巨集變數通過替換後在其左右各加上乙個雙引號。

2.##被稱為連線符(concatenator),用來將兩個token連線為乙個token。注意這裡連線的物件是token就行,而不一定是巨集的變數。比如你要做乙個選單項命令名和函式指標組成的結構體的陣列,並且希望在函式名和選單項命令名之間有直觀的、名字上的關係。

#include

#define myprint(x) printf("the param"#x" is %d/n", param ## x)

int main()

結果:the param1 is 2

the param2 is 3

the param3 is 4

press any key to continue

參考:c語言巨集的高階應用

4.交換任意型別的兩個數,不用中間變數。

a=a+b;

b=a-b;

a=a-b;

5.不用迴圈判斷乙個int型數是否是2的冪。

方法一:n&(n-1)

#include

int main()

return 0;}

方法二:遞迴,不算好方法(和迴圈類似)。

#include

int fun(int a)

int main()

return 0;

}6.cache(快取)和虛擬儲存技術。

cpu快取(cache memory)位於cpu與記憶體之間的臨時儲存器,它的容量比記憶體小但交換速度快。在快取中的資料是記憶體中的一小部分,但這一小部分是短時間內cpu即將訪問的,當cpu呼叫大量資料時,就可避開記憶體直接從快取中呼叫,從而加快讀取速度。由此可見,在cpu中加入快取是一種高效的解決方案,這樣整個記憶體儲器(快取+記憶體)就變成了既有快取的高速度,又有記憶體的大容量的儲存系統了。快取對cpu的效能影響很大,主要是因為cpu的資料交換順序和cpu與快取間的頻寬引起的。

快取的工作原理是當cpu要讀取乙個資料時,首先從快取中查詢,如果找到就立即讀取並送給cpu處理;如果沒有找到,就用相對慢的速度從記憶體中讀取並送給cpu處理,同時把這個資料所在的資料塊調入快取中,可以使得以後對整塊資料的讀取都從快取中進行,不必再呼叫記憶體。

正是這樣的讀取機制使cpu讀取快取的命中率非常高(大多數cpu可達90%左右),也就是說cpu下一次要讀取的資料90%都在快取中,只有大約10%需要從記憶體讀取。這大大節省了cpu直接讀取記憶體的時間,也使cpu讀取資料時基本無需等待。總的來說,cpu讀取資料的順序是先快取後記憶體。

虛擬儲存器是乙個邏輯模型,並不是乙個實際的物理儲存器。若允許邏輯位址空間大於主存的實際空間,那麼好像計算機系統為使用者提供了乙個比主存的實際容量大的主儲存器。當主機記憶體中應用程式過多時,可以把暫時不用的程式區域複製到外儲存器上,把使用者當前要執行的程式快排程到記憶體中。在這過程中使用者查覺不到這一排程過程,這樣就好像為使用者提供了乙個遠大於實際記憶體的空間。

虛擬儲存的排程策略分為:頁式、段式、段頁式。

cache和虛擬儲存都基於程式的區域性性原理。

7.不用多餘儲存空間降字串後面3位挪到字串前面。

#include

#include

int main()

printf("%s/n", str);

return 0;

}8. 類過載、隱藏與覆蓋區別

成員函式被過載的特徵:

(1)相同的範圍(在同乙個類中);

(2)函式名字相同;

(3)引數不同;

(4)virtual 關鍵字可有可無.

覆蓋是指派生類函式覆蓋基類函式,特徵是:

(1)不同的範圍(分別位於派生類與基類);

(2)函式名字相同;

(3)引數相同;

(4)基類函式必須有virtual 關鍵字.

面試題目總結

二叉樹相關面試題目 結點資料結構 typedef struct treenode 1.二叉樹的前序遍歷 遞迴void preorder treenode root vector res 非遞迴 vectorpreorder treenode root else 2.二叉樹中序遍歷 遞迴void mi...

面試題目總結

瀏覽器標準模式和怪異模式之間的區別是什麼 所謂的標準模式是指,瀏覽器按w3c標準解析執行 怪異模式則是使用瀏覽器自己的方式解析執行 因為不同瀏覽器解析執行的方式不一樣,所以我們稱之為怪異模式。瀏覽器解析時到底使用標準模式還是怪異模式,與你網頁中的dtd宣告直接相關,dtd宣告定義了標準文件的型別 標...

面試題目總結

ele css 1 兩個div是inline block的,為什麼之間有間距,如果第二個div裡邊有文字,為什麼兩個div不對齊,如何對齊 2 伸縮盒模型flex布局,考察 flex direction column flex wrap wrap js 1 點選事件繫結,各個方式繫結 2 基礎dom...