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 還有一種利用遞迴的方法。這...