C语言面试题目
一、选择题
1.考查类型转换
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.考查递归调用
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.考查指针,细心且对指针和数组有深入理解
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.考查多维数组与指针
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.考查逗号表达式
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.用预处理指令#define 声明一个常数,用以表明年中有多少秒(忽略闰年问题)
define SECONDS_PER_YEAR (60 60 24 * 365)UL
7.关键字 static 的作用是什么?
这个简单的问题很少有人能回答完全。在 C 语言中,关键字 static 有三个明显的作用:
1).在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2).在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
8.do……while和while……do有什么区别?
答案:前一个循环一遍再判断,后一个判断以后再循环。
9.程序的局部变量存在于()中,全局变量存在于()中,动态申请数据存在于()中。
答案:栈;静态区;堆
10.C语言中.h 头文件中的 ifndef/define/endif 的作用?
答:防止该头文件被重复引用。
三、改错题
11.找错
void test1()
{
char string[10];
char*str1="0123456789";
strcpy(string, str1);
}
答:表面上并且编译都不会错误。但如果string数组原意表示的是字符串的话,那这个赋值就没有达到意图。最好定义为char string[11],这样最后一个元素可以存储字符串结尾符'\0';
- 找错
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,因为没有break语句,switch中会一直计算到b=0。这是提醒我们不要忘了break。
13、请找出下面代码中的所以错误并改正
说明:以下代码是把一个字符串倒序,如‚abcd‛倒序后变为‚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 分配一个空间
char d = dest;
char* s = &src[len-1];//指向最后一个字符
while( len-- != 0 )
d++=s--;
*d = 0;//尾部要加\0
printf("%s\n",dest);
free(dest);// 使用完,应当释放空间,以免造成内存汇泄露
return 0;
}
14.我们可以先看看这个代码输出了啥
include "stdio.h"
int main()
{
int i = 3;
printf("%d\n",i++*3+1);
return 0;
}
这个涉及考察 「++i」和「i++」在执行顺序。
输出:10
四、程序题(任选一题)
15.冒泡法写一个从大到小排序
16.一组数据从小到大排序,利用二分法查找某个值
17.自己实现strcpy函数或者strcat函数