/***********************************《程式員面試寶典》第二版筆記*******************************************/
宏定義1. 用一個宏定義FIND求一個結構體struct裡任意變數相對struct的位移量struct student{int a;char b[20];double c;};則FIND(student, a);//等於0FIND(student, b);//等於4答:#define FIND(struc, e)(size_t)&(((struct*)0)->e)2. 用預先處理指令#define 聲明一個常數,用以表明1年中有多少秒?答:#define SECONDS_PER_YEAR (60*60*24*365)UL3. 寫一個“標準”宏MIN這個宏輸入兩個參數並返回較小的一個答:#define MIN(a, b) ((a) < (b) ? (a) : (b) )const4. What does the keyword "const" means in C program? Please at least maketwo examples about the usage of const答:1)定義常量2)修飾函數參數3)修飾函數傳回值5. const與#define 相比有什麼不同?答:const常量有資料類型,宏常量沒有資料類型sizeof6. What is the output of the following code?#include <stdio.h>#include <string.h>struct {short a1;short a2;short a3;}A;//2位元組對齊結果為6struct {long a1;short a2;}B;//4位元組對齊結果為8int main(){char* ss1 = "0123456789";//ss1是一個字元指標為4位元組char ss2[] = "0123456789";//字元數組,加上隱含的"\0",為11char ss3[100] = "0123456789";//字元數組預分配100 * 1 = 100int ss4[100];//整形數組預分配100 * 4 = 400char q1[]="abc";//與ss2類似為4char q2[] = "a\n";//\n也算一做一位,為3個位元組char* q3 = "a\n";//字元指標為4char *str1 = (char *)malloc(100);//指標為4void *str2 = (void *)malloc(100);//指標為4printf("sizeof(ss1)=%d, sizeof(ss2)=%d, sizeof(ss3)=%d, sizeof(ss4)=%d\n",sizeof(ss1), sizeof(ss2), sizeof(ss3), sizeof(ss4));printf("sizeof(q1)=%d, sizeof(q2)=%d, sizeof(q3)=%d\n", sizeof(q1), sizeof(q2), sizeof(q3));printf("sizeof(A)=%d, sizeof(B)=%d\n", sizeof(A), sizeof(B));printf("sizeof(str1)=%d, sizeof(str2)=%d\n", sizeof(str1), sizeof(str2));}7. 求下面程式的結果#include <iostream.h>class A1{public:int a;static int b;A1();~A1();}; //4因為static是靜態變數存放在全域資料區的,而sizeof計算棧中分配的大小,是不會計算在內的class A2{public:int a; //4char c;//4位元組對齊A2();~A2();};//8class A3{public:float a;//4char c;//4A3();~A3();};//8class A4{public:float a;//4int b;//4char c;//4A4();~A4();};//12class A5{public:double d;//8float a;//4int b;//4char c;//1A5();~A5();};//24int main(){cout << sizeof(A1)<<endl;cout << sizeof(A2)<<endl;cout << sizeof(A3)<<endl;cout << sizeof(A4)<<endl;cout << sizeof(A5)<<endl;}8. sizeof 和strlenchar *ss = "0123456789";printf("sizeof(ss)=%d, sizeof(*ss)=%d\n", sizeof(ss), sizeof(*ss));答:sizeof(ss) = 4,因為ss是指向字串常量的字元指標 sizeof(*ss) = 1, 因為*ss是第一個字元9. char ss[100] = "0123456789";printf("sizeof(ss)=%d, strlen(ss)=%d\n", sizeof(ss), strlen(ss));答:sizeof(ss) = 1 * 100 = 100,記憶體中預分配 strlen(ss) = 10,它的內部實現是用一個迴圈計算字串的長度,直到"\0"為止10. int ss[100] = "0123456789";printf("sizeof(ss)=%d, strlen(ss)=%d\n", sizeof(ss), strlen(ss));答:sizeof(ss) = 4 * 100 = 400, strlen(ss)錯誤,因為strlen參數只能是char型11. char var [10];int test(char var[]){return sizeof(var);//返回4,因為var[]已經退化成一個指標}int main(){int len = 0;printf("len=%d\n", test(var));return 0;}12. 一個空類佔多少空間?多重繼承的空類呢?答:一個空類占空間為1, 多重繼承的空類所佔空間還是1.13.內嵌函式和宏的差別答:1)內嵌函式要做參數類型檢查,宏不用只是簡單替代2)內嵌函式更安全可靠