C語言面試題目
一、選擇題
1.考查類型轉(zhuǎn)換
main()
{
struct node
{
int a;
int b;
int c;
};
struct node s= { 3, 5,6 };
struct node *pt = &s;
printf("%d" , (int)pt);
}
這段程序的輸出是:
(a) 3 (b) 5 (c) 6 (d) 7
2.考查遞歸調(diào)用
int foo ( int x , int n)
{
int val;
val =1;
if (n>0)
{
if (n%2 == 1) val = val *x;
val = val * foo(x*x , n/2);
}
return val;
}
這段代碼對x和n完成什么樣的功能(操作)?
(a) x^n (x的n次冪) (b) x*n(x與n的乘積)
(c) n^x(n的x次冪) (d) 以上均不是
3.考查指針,細(xì)心且對指針和數(shù)組有深入理解
main()
{
int a[5] = {1,2,3,4,5};
int ptr = (int)(&a+1);
printf("%d %d" , *(a+1), *(ptr-1) );
}
這段程序的輸出是:
(a) 2 2 (b) 2 1 (c) 2 5 (d) 以上均不是
4.考查多維數(shù)組與指針
void foo(int [][3] );
main()
{
int a [3][3]= { { 1,2,3} , { 4,5,6},{7,8,9}};
foo(a);
printf("%d" , a[2][1]);
}
void foo( int b[][3])
{
++ b;
b[1][1] =9;
}
這段程序的輸出是:
(a) 8 (b) 9 (c) 7 (d)以上均不對
5.考查逗號表達(dá)式
main()
{
int a, b,c, d;
a=3;
b=5;
c=a,b;
d=(a,b);
printf("c=%d" ,c);
printf("d=%d" ,d);
}
這段程序的輸出是:
(a) c=3 d=3 (b) c=5 d=3 (c) c=3 d=5 (d) c=5 d=5
答案:aacbc
二、簡答題
6.用預(yù)處理指令#define?聲明一個(gè)常數(shù),用以表明年中有多少秒(忽略閏年問題)
define?SECONDS_PER_YEAR?(60??60??24?*?365)UL
7.關(guān)鍵字 static 的作用是什么?
這個(gè)簡單的問題很少有人能回答完全。在 C 語言中,關(guān)鍵字 static 有三個(gè)明顯的作用:
1).在函數(shù)體,一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中維持其值不變。
2).在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。它是一個(gè)本地的全局變量。
3). 在模塊內(nèi),一個(gè)被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。
8.do……while和while……do有什么區(qū)別?
答案:前一個(gè)循環(huán)一遍再判斷,后一個(gè)判斷以后再循環(huán)。
9.程序的局部變量存在于()中,全局變量存在于()中,動(dòng)態(tài)申請數(shù)據(jù)存在于()中。
答案:棧;靜態(tài)區(qū);堆
10.C語言中.h 頭文件中的 ifndef/define/endif 的作用?
答:防止該頭文件被重復(fù)引用。
三、改錯(cuò)題
11.找錯(cuò)
void test1()
{
char string[10];
char*str1="0123456789";
strcpy(string, str1);
}
答:表面上并且編譯都不會(huì)錯(cuò)誤。但如果string數(shù)組原意表示的是字符串的話,那這個(gè)賦值就沒有達(dá)到意圖。最好定義為char string[11],這樣最后一個(gè)元素可以存儲(chǔ)字符串結(jié)尾符'\0';
- 找錯(cuò)
int func(int a)
{
int b;
switch(a)
{
case 1: b=30;
case 2: b=20;
case 3: b=16;
default: b=0;
}
return b;
}
則func(1)=?
答:func(1)=0,因?yàn)闆]有break語句,switch中會(huì)一直計(jì)算到b=0。這是提醒我們不要忘了break。
13、請找出下面代碼中的所以錯(cuò)誤并改正
說明:以下代碼是把一個(gè)字符串倒序,如?abcd?倒序后變?yōu)?dcba?
1、#include"string.h"
2、main()
3.{
4、 charsrc="hello,world";
5、 char dest=NULL;
6、 int len=strlen(src);
7、 dest=(char)malloc(len);
8、 char d=dest;
9、 char* s=src[len];
10、 while(len--!=0)
11、 d++=s--;
12、 printf("%s",dest);
13、 return 0;
14、}
答: 方法 1:
int main()
{
char* src = "hello,world";
int len = strlen(src);
char* dest = (char)malloc(len+1);//要為\0 分配一個(gè)空間
char d = dest;
char* s = &src[len-1];//指向最后一個(gè)字符
while( len-- != 0 )
d++=s--;
*d = 0;//尾部要加\0
printf("%s\n",dest);
free(dest);// 使用完,應(yīng)當(dāng)釋放空間,以免造成內(nèi)存匯泄露
return 0;
}
14.我們可以先看看這個(gè)代碼輸出了啥
include "stdio.h"
int main()
{
int i = 3;
printf("%d\n",i++*3+1);
return 0;
}
這個(gè)涉及考察 「++i」和「i++」在執(zhí)行順序。
輸出:10
四、程序題(任選一題)
15.冒泡法寫一個(gè)從大到小排序
16.一組數(shù)據(jù)從小到大排序,利用二分法查找某個(gè)值
17.自己實(shí)現(xiàn)strcpy函數(shù)或者strcat函數(shù)