C 常見面試題

2021-05-02 20:03:44 字數 3550 閱讀 2962

1 sizeofconst預處理題目

sizeof相關系列問題

(1) 對於struct s; sizeof(s) = 8; 因為當結構體內的元素長度都小於處理器位數(32位=4位元組)的時候,便以結構體中最長的資料元素為對齊條件。在本題中,a 按 1 位元組對齊,b 按 4 位元組對齊,所以s預設對其引數為8。

struct a; sizeof(a)=6; 原因同上,結構體按最長元素 short(2位元組對齊)。

(2) 對於 int a[200]; sizeof(a) = 200* sizeof(int) = 800; 對整個陣列大小評測。

int* a = new int[200]; sizeof(a) = 4; 對指標大小進行評測。

char str="012345"; sizeof(str) = 7; str是乙個字元陣列,陣列最初大小未定,由具體值"012345"來決定,6*sizeof(char) = 6,還有隱含的"\0",所以一共7位。

char str="s\n"; sizeof(str) = 3; 回車"\n" 是乙個字元,可以檢視ascii表。還有\r、\t等等字元。

(3) 這種使用位域的也有,下面的**中,元素最大為1位元組大小=8 bits,元素按照1位元組進行對齊, sizeof(bb) = 1 + 1(4 bits+2bits < 8 bits) + 1(3bits) = 3

struct bb

v;v.c=100;

printf("%d",v.x.s3);

結果:3。100的2進製是1100100,去掉後面5位餘11放入x.s3中,所以結果是3。

(4) 對於空的類進行評測。 class a {}; sizeof(a) = 1; 預設空類是有乙個佔位符的。

對於虛函式,下面的**中,sizeof(a)=4;sizeof(b) =4; 任何含有虛函式的類都擁有乙個vptr指標,用來指向虛函式表vtable。sizeof(vptr) = 4。

class a

;class b: public a{};

class a; sizeof(a) = 1; 對於靜態成員變數是分配在全域性儲存區的,所以a還是相當於空類。

class c:public virtual a {}; sizeof(c)=4; 對於虛擬繼承的類擁有虛函式表,所以空類c含有vptr.

(5) 設有以下說明和定義:

typedef union date; // sizeof(int)*5 = 20

struct data too; //4+20+8 = 32

date max;

則語句 printf("%d",sizeof(struct date)+sizeof(max));的執行結果是:52

對於union聯合來說,取其中最大元素長度來做為聯合大小。

(6) 使用malloc或者new 分配記憶體,void *pp=malloc(10); sizeof(p) = 4; 跟指標一樣,sizeof 只能測出靜態陣列的長度,無法檢測動態分配的或外部陣列大小

(7) 下面函式輸出結果:對於char str[100]或者char str引數都退化為char* str,這樣的函式即使傳入char s[10] 也是可以的

void func(char str[100])

char s[10]; //函式對陣列長度並沒有檢驗

func(s);

結果:sizeof( char* ) = 4;

如何強制str為100位陣列?可以如此宣告 char ( &str )[100];

理解順序:第

一、str宣告為乙個引用;第

二、引用乙個100元素陣列;第

三、陣列元素每個為int大小。

void func(char (&str)[100])

char s[100];

func(s);//這裡必須給定100位長度char陣列

結果:100*sizeof(char) = 100

const 常見題目

(1) const 與 #define有什麼不同?

第一、 const 常量有資料型別,而巨集沒有資料型別。編譯器可以對const 常量進行型別檢查,而對巨集只進行字元替換沒有型別檢查;

第二、有些編譯器可以對const常量進行除錯,但不能對巨集常量進行除錯;

第三、const 可以用來修飾函式引數、函式返回值;在c++裡還可以用來修飾函式,定義內中某個成員函式為常量函式。

(2) 寫乙個標準巨集min,這個巨集輸入兩個引數並返回較小的乙個

#define min(a,b) ( ( a ) <= ( b ) ? ( a ) : ( b ) )

第一、巨集是方便的產生嵌入**的唯一方法;

第二、三重條件操作符對編譯器來說可以產生比if-then-else更優化的**;

第三、必須把巨集中的引數用括號括起來。

(3) 內聯函式和巨集的差別是什麼?

內聯函式和普通函式相比可以加快程式執行的速度,因為不需要中斷呼叫。編譯時內聯函式**直接嵌入到目標**中;而巨集只是字元替換。內聯函式要做型別檢查,相對於巨集更安全可靠。

inline只用於如下情況:

第一、乙個函式被不斷呼叫;

第二、函式只有簡單的幾行,且函式內不包含for、while、switch等語句。

(4) 對於const符號常量,說明上面三種描述的區別:

constchar*p

charconst*p

char*constp

1和2相同,如果const位於星號的左側,則const就是用來修飾指標所指向的變數,即指標指向為常量,不能修改指標指向物件的內容;如果const位於星號的右側,const就是修飾指標本身,即指標本身是常量,不能修改指標的指向。

寫出二分查詢的**

int bfind( int* a, int len, int val )

2 常見字串面試題

寫出在母串中查詢子串出現次數的**

在母串中查詢子串出現次數的**。*str:母字串;*s:子字串*/

int count(char* str,char* s)

if( *s2 == '\0' )

count++;

str++;

}return count;

}查詢第乙個匹配子串位置,如果返回的是s1長度len1表示沒有找到。

size_t find(char* s1,char* s2)

if( j == len2 )

break;

}return ( i < len1-len2 ) ? i : len1;

}實現strcpy函式(出現次數相當頻繁的一道題)

char *strcpy( char *strdest, const char *strsrc)

注:《visual c++與物件導向程式設計教程》第101頁對關於此函式的呼叫有精彩分析。

實現strcmp函式

int strcmp( char* strfir, char* strsec)

實現字串翻轉

void myreverse(char* str)

{ assert(str != null);

char * p1 = str;

char * p2 = str-1;

C常見面試題

下面的題是供大家查漏補缺用的,真正的把這些題搞懂了,才能 以不變應萬變 回答問題的時候能聯絡做過專案的例子是最好的,有的問題後面我已經補充聯絡到專案中的對應的案例了。1 簡述private protected public internal修飾符的訪問許可權。private 私有成員,在類的內部才可...

c 常見面試題

許多面試題看似簡單,卻需要深厚的基本功才能給出完美的解答。企業要求面試者寫乙個最簡單的strcpy函式都可看出面試者在技術上究竟達到了怎樣的程度,我們能真正寫好乙個strcpy函式嗎?我們都覺得自己能,可是我們寫出的strcpy很可能只能拿到10分中的2分。讀者可從本文看到strcpy函式從2分到1...

C 常見面試題

鍊錶反轉單向鍊錶的反轉是乙個經常被問到的乙個面試題,也是乙個非常基礎的問題。比如乙個鍊錶是這樣的 1 2 3 4 5 通過反轉後成為5 4 3 2 1.struct linka void reverse linka head head next null head pre 還有一種利用遞迴的方法。這...