C語言經典面試題!快來測一測你的基礎語法扎不紮實,你能做出幾題?
一、請填寫 bool , float, 指標變數 與“零值”比較的 if 語句。
提示:這裡“零值”可以是 0, 0.0 , FALSE 或者“空指標” 。例如 int 變數 n 與“零值”比較的 if 語句為:
if ( n == 0 )
if ( n != 0 )\
以此類推。
(1)請寫出 bool flag 與“零值”比較的 if 語句:
【標準答案】if ( flag ) if ( !flag )
(2)請寫出 float x 與“零值”比較的 if 語句:
【標準答案】 const float EPSINON = 0.00001;if ((x >= - EPSINON) && (x <= EPSINON);不可將浮點變數用“==”或“!=”與數字比較,應該設法轉化成“>=”或“<=”此類形式。
(3)請寫出 char *p 與“零值”比較的 if 語句:
【標準答案】 if (p == NULL) if (p != NULL)
二、以下為 Linux下的 32 位 C程式,請計算 sizeof 的值。
char str[] = “Hello” ; char *p = str ;int n = 10;
請計算:
(1)sizeof (str ) =
(2)sizeof ( p ) =
(3)sizeof ( n ) =
(4)
void Func ( char str[100]) { …… ; }
請計算:sizeof( str ) =
(5)void *p = malloc( 100 );
請計算:sizeof ( p ) =
【標準答案】(1)6、(2)4、(3)4、(4)4、(5)4
三、 long a=0x801010; a+5=?
【標準答案】0x801010用二進位制表示為:“1000 0000 0001 0000 0001 0000”,十進位制的值為8392720,再加上5就是8392725。
四、設有以下說明和定義:
typedef union { long i; int k[5]; char c; } DATE; struct data { int cat; DATE cow; double dog; } too; DATE max;
則語句 printf("%d",sizeof(struct date)+sizeof(max));的執行結果是:___
【標準答案】DATE是一個union, 變數公用空間. 裡面最大的變數型別是int[5], 佔用20個位元組。所以它的大小是20 data是一個struct,每個變數分開佔用空間。依次為int4 + DATE20 + double8 = 32。所以結果是 20 + 32 = 52。
五、請問以下程式碼有什麼問題:
int main() { char a; char *str=&a; strcpy(str,"hello"); printf(str); return 0; }
【標準答案】沒有為str分配記憶體空間,將會發生異常 問題出在將一個字串複製進一個字元變數指標所指地址。雖然可以正確輸出結果,但因為越界進行內在讀寫而導致程式崩潰。
六、請問以下程式碼有什麼問題:
char* s="AAA"; printf("%s",s); s[0]='B'; printf("%s",s);
有什麼錯?
【標準答案】"AAA"是字串常量。s是指標,指向這個字串常量,所以宣告s的時候就有問題。 cosnt char* s="AAA"; 然後又因為是常量,所以對是s[0]的賦值操作是不合法的。
七、c和c++中的struct有什麼不同?
【標準答案】c和c++中struct的主要區別是c中的struct不可以含有成員函式,而c++中的struct可以。
八、寫出輸出結果
int main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); }
九、
char szstr[10]; strcpy(szstr,"0123456789"); 產生什麼結果?為什麼?
【標準答案】長度不一樣,出現段錯誤。
十、
int a=248; b=4; int const c=21; const int *d=&a; int *const e=&b; int const *f const =&a;
請問上述表示式哪些會被編譯器禁止?為什麼?
十一、
void main() { char aa[10]; printf(“%d”,strlen(aa)); }
會出現什麼問題?列印結果是是多少?
【標準答案】sizeof()和初不初始化,沒有關係,strlen()和初始化有關,列印結果值未知。
十二、
給定結構struct A { char t:4; char k:4; unsigned short i:8; unsigned long m; };
問sizeof(A) = ?
【標準答案】8
十三、
struct name1 { char str; short x; int num; };
求sizeof(name1)?
【標準答案】8
十四、
struct name2 { char str; int num; short x; };
求sizeof(name2)?
【標準答案】12
十五、程式哪裡有錯誤?
wap( int* p1,int* p2 ) { int *p; *p = *p1; *p1 = *p2; *p2 = *p; }
【標準答案】p為野指標
十六、什麼是預編譯,何時需要預編譯?
預編譯又稱為預處理,是做些程式碼文字的替換工作。處理#開頭的 指令,比如拷貝#include 包含的檔案程式碼,#define 巨集定義的替換,條件 編譯等,就是為編譯做的預備工作的階段,主要處理#開始的預編譯 指令,預編譯指令指示了在程式正式編譯前就由編譯器進行的操作, 可以放在程式中的任何位置。
c 編譯系統在對程式進行通常的編譯之前,先進行預處理。c 提供的 預處理功能主要有以下三種:1)巨集定義 2)檔案包含 3)條件編 譯
十七、(void *)ptr 和 (*(void**))ptr的結果是否相同?其中ptr為同一個指標。
【標準答案】(void *)ptr 和 (*(void**))ptr值是相同的
十八、要對絕對地址0x100000賦值,我們可以用 (unsigned int*)0x100000 = 1234; 那麼要是想讓程式跳轉到絕對地址是0x100000去執行,應該怎麼做?
【標準答案】*((void (*)( ))0x100000 ) ( ); 首先要將0x100000強制轉換成函式指標,即: (void (*)())0x100000,然後再呼叫它: *((void (*)())0x100000)();
十九、int a,b,c 請寫函式實現c=a+b ,不可以改變資料型別,如將c改為long int,關鍵是如何處理溢位問題?
【標準答案】
bool add (int a, int b,int *c) { *c=a+b; return (a>0 && b>0 &&(*ca || *c>b))); }
————————————————
今天的學習就到此結束,如果你想學習更多程式設計知識,歡迎關注我~
- End -
————————————————
不管你是轉行也好,初學也罷,進階也可,如果你想學程式設計,進階程式設計師
【值得關注】我的程式設計學習交流俱樂部【點選進入】
————————————————
程式設計入門資料(網盤連結免費分享):