C语言企业常问面试题
C语言面试题大全
- ------------------------C语言试题1START-------------------
- 一、选择题
- 二、填空题
- 三、简答题
- 四、编程
- ------------------------C语言试题1END-----------------------
- ------------------------C语言试题2START--------------------
- 一、选择题
- 二、填空题
- 三、简答题
- 四、编程
- ------------------------C语言试题2END--------------------
------------------------C语言试题1START-------------------
一、选择题
1、C语言允许函数值类型缺省定义,此时该函数值隐含的类型是()。
A、float型B、int型C、long型D、double型参考答案:B
2、一个指向整数的数组指针可以定义为()。
A、int (*ptr)[]B、int *ptr[]C、int *(ptr[])D、int ptr[]参考答案:A
3、若有定义:int a[3][4]={{1, 2}, {0}, {1, 2, 3}};则a[1][1]的值为()。
A、3B、{1, 2}C、1D、0参考答案:D
4、下面这段代码输出的i的值是()。
int i=3;while(i--)printf(“%d\n”, i);A、3 2 1 0B、2 1 0C、1 0D、2 1参考答案:B
5、以下程序的打印结果是()。
#include #define N 2#define M N+1#define NUM (M+1)*M/2int main(void){ int i = 0; while(i < NUM) printf("%d", i++); printf("\n"); return 0;}A、01234567B、012345C、123456D、01参考答案:A
6、已知声明:
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, *p=1;则不能表示数组a中的元素的表达式是()。
A、*pB、a[10]C、*aD、3[p]参考答案:B
7、以下定义语句中正确的是()。
A、char a='A' b='B'; B、float a=b=a;C、int a=10,*b=&a; D、float *a,b=&a;参考答案:C
8、设有如下的程序段:
char str[ ]=“Hello”;
char ptr;
ptr=str;
执行上面的程序段后,(ptr+5)的值为()。
A、'o'B、'\0'C、不确定的值D、'o'的地址参考答案:B
9、若有int *p1, *p2,k; 不正确的语句是()。
A、p1=&kB、p2=p1 C、*p1=k+12 D、k=p1+p2 参考答案:C
10、在循环语句的循环体中执行break语句,其作用是()。
A、跳出该循环体,提前结束循环B、继续执行break语句之后的循环体各语句C、结束本次循环,进行下次循环D、终止程序运行参考答案:A
11、为表示、“a和b都大于0”,应使用的C语言表达式是()。
A、(a>0)&&(b>0)B、a&&bC、(a>0)||(b>0)D、(a>0)&(b>0)参考答案:A
12.若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是( )
A.函数的实参和其对应的形参共占同一存储单元B.形参只是形式上的存在,不占用具体存储单元C.同名的实参和形参占同一存储单元D.函数的形参和实参分别占用不同的存储单元参考答案:D
13、有以下程序:
int func(char *s) { char *t=s;while(*t++){;} t--; return(t-s); }int main(void){ char *s = "abcdefghijk"; int n = func(s); printf("%d\n", n);}
程序的执行结果是( )
A.字符串s的长度B.比较两个串的大小C.将串s复制到串tD.求字符串s所占字节数参考答案:B
14、设有如下程序段,下面描述中正确的是 ( )。
int k=10; while(k=0) k=k-1;
A 循环执行一次 B循环是无限循环 C循环体语句一次也不执行 D循环体语句执行一次 参考答案:C
15、以下函数调用语句中含有( )个实参。
func((e1,e2),(e3,e4,e5));
A 2 B 3 C 5 D 语法错误参考答案:A
16、以下程序的输出结果为( )。
#define ADD(x) x*x main( ) { int a=4,b=6,c=7,d=ADD(a+b)*c; printf("d=%d",d); }
A d=70 B d=80 C d=140 D d=700参考答案:D
17、若有以下定义,则p+5表示_______.
int a[10],*p=a;
A元素a[5]的地址 B元素a[5]的值 C元素a[6]的地址 D元素a[6]的值参考答案:A
18、若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是( )
A.函数的实参和其对应的形参共占同一存储单元B.形参只是形式上的存在,不占用具体存储单元C.同名的实参和形参占同一存储单元D.函数的形参和实参分别占用不同的存储单元参考答案:D
19、以下叙述中错误的是( )
A.函数的形参存放在数据段中B.函数可以返回地址值C.可以给指针变量强制赋一个浮点数作为地址值D.可以给指针变量赋NULL参考答案:A
20、有以下程序
#include void fun(char * (*p) ) { ++p; printf("%s\n",*p); } int main(void) { char *a[ ]={"Morning","Afternoon","Evening","Night"}; fun(a); }
程序的运行结果是( )
A.AfternoonB.fternoonC.MorningD.orning参考答案:A
二、填空题
1、以下代码试图就出a、b、c的最小值:
#includeint main(void){ int a,b,c,t1,t2; scanf("%d%d%d",&a,&b,&c); t1=a<b? A a:b; t2=c<t1? B c:t1;printf("%d\n",t2);}
2、已有定义如下:
struct node{ int data; struct node *next;}*p;
以下语句调用malloc函数,使指针p指向一个具有struct node类型的动态存储空间,请填写所需空间的大小 struct node
*p = (struct node *)malloc( sizeof(struct node) );
3、表达式(int)((double)5/2+2.5)的值是: 5
4、
int main(void) { char *cptr,c; void *vptr,v; c=10;v=0; }
上述程序有何错误:
不能定义void型普通变量 [每空2分]
5、用变量m给出下面的定义
1 一个整型数 int m;
2 一个指向整型数的指针 int *m;
3 一个指向指针的指针,它指向的指针是指向一个整型数 int *p= 10;
int *m = p;
4一个有10个整型数的数组 int m[10];
5一个有10个指针的数组,该指针是指向一个整型数的 int *m[10]; m = 10;
6一个指向有10个整型数数组的指针 int (*p)[10];
7 一个指向函数的指针,该函数有一个整型参数并返回一个整型数 int *m(int m){ return m;}
8 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数 int *m[10];m=m(x);m(intn){return n;}
三、简答题
1、指出下面代码的不妥之处:
void get_memory(T_S8 *p, T_S16 nNum) { p = (T_S8 *)malloc(sizeof(T_S8) * nNum); } void Test(void) { T_S8 *str = NULL; get_memory(str, 100); strcpy(str, "hello"); }
答 :T_S8,T_S16未宏定义 值传递不能改变str的值,所以实参str的值仍然为NULL,不能执行strcpy(str,“hello”) , 会发生段错误。
2、以下程序的运行结果如何?原因?
char *get_memory(void){ char p[] = "hello world"; return p;}int main(void){ char *str = NULL; str = get_memory();//此处无须括号 printf("%s", str);//未解引用}
答:编译出错。 结果不确定,函数调用结束,数组p的空间被释放,不用再次引用
3、以下test函数的运行结果如何?原因?
void test(void){ char *str = (char *) malloc(100); strcpy(str, “hello”); free(str); if(str != NULL) { strcpy(str, “world”); printf("%s", str); }}
答:输出 world 。 指针所指空间被free后不能再次被引用
四、编程
1、写一个程序,计算1到100的累加和。
int i=1,sum=0;for(i=1;i<=100;i++){sum += i;}printf(“%d\n”,sum);
2、写一个函数,将作为实参出进去的字符串反转。
void reserverString(char str[]){char tmp;int i, j;for (i = 0, j = strlen(str) - 1; i < j; i++, j--){tmp = str[i];str[i] = str[j];str[j] = tmp;}}
------------------------C语言试题1END-----------------------
------------------------C语言试题2START--------------------
一、选择题
1、在函数中未指定存储类别的局部变量,其隐含的存储类别是()。
A、静态(staticB、外部(externC、自动(auto)D、寄存器(register)参考答案:C
2、以下各C语句中正确的是()。
A、char st[4][5]={ "ABCDE" };B、char *s = "ABCDE"; s[2] = 'Z';C、char s[5] = {'A', 'B', 'C', 'D', 'E'};D、char *S; scanf("%S", S);参考答案:C
3、若有定义:int a[3][4]={{1, 2}, {0}, {1, 2, 3}};则a[1][1]的值为()。
A、3B、{1, 2}C、1D、0参考答案:D
4、在Linux下的32位C程序中,请计算sizeof的值()。
char str[] = “Hello”;
char *p = str;
请计算:sizeof§ = ( )
A、1B、4 C、5 D、6参考答案:B
5、
#include int main(void){ float x = 0.1; if(x == 0.1) printf("Equal"); else printf("Not Equal"); return 0;}
则运行的结果是()。
A、EqualB、Not EqualC、运行错误D、输出依赖于编译器参考答案:B
6、下面程序段的运行的结果是()。
char *s="abcde";s+=2;printf("%d", s);
A、cdeB、字符'c'C、字符'c'的地址D、无确定的输出结果参考答案:A
7、不能把字符串“Hello!”赋给数组b的语句是()。
A、char b[10]={'H','e','l','l','o','!'}; B、char b[10];b="Hello!";C、char b[10];strcpy(b,"Hello!"); D、char b[10]="Hello!";参考答案:B
8、若a为二维数组,则a[1][3]等价于()。
A、*((a+1)+3)B、*(a[1]+3)C、(*(a+1)+3) D、&a[1]+3参考答案:B
9、break语句的正确用法是()。
A、无论在任何情况下,都中断程序的执行,退出到系统下一层。B、在多重循环中,只能退出最靠近的那一层循环语句。C、跳出多重循环。D、只能修改控制变量。参考答案:B
10、有以下程序
#includeint main(void){int y=9;for( ; y>0; y--) { if(y%3 == 0) printf("%d",--y);}}
程序的运行结果是( )
A.741B.963C.852D.875421参考答案:C
11、已知字符‘A’的ASCⅡ代码值是65,字符变量c1的值是‘A’,c2的值是‘D’。
则执行语句printf(“%d,%d”,c1,c2-2);后,输出结果是( )
A.A,BB.A,68C.65,66D.65,68参考答案:C
12、有以下程序
#include void fun(char * (*p) ) { ++p; printf("%s\n",*p); } int main(void) { char *a[ ]={"Morning","Afternoon","Evening","Night"}; fun(a); }
程序的运行结果是( )
A.AfternoonB.fternoonC.MorningD.orning参考答案:A
13、有以下程序
main(){ int a=1, b=3, c=5; int *p1=&a, *p2=&b, *p=&c; *p =*p1*(*p2); printf("%d\n",c);}执行后的输出结果是
A 1B 2C 3D 4参考答案:C
14、在16位编译系统上,若有定义int a[]={10,20,30}, *p=&a;,当执行p++;后,下列说法错误的是( )
A p向高地址移了一个字节B p向高地址移了一个存储单元C p向高地址移了两个字节D p与a+1等价参考答案:A
15、若有以下定义,则对a数组元素的正确引用是_________.
int a[5],*p=a;
A.*&a[5] B.a+2 C.*(p+5) D.*(a+2)参考答案:D
16、设已有定义: int a[10]={15,12,7,31,47,20,16,28,13,19},*p; 下列语句中正确的是( )
A for(p=a;a<(p+10);a++); B for(p=a;p<(a+10);p++); C for(p=a,a=a+10;p<a;p++);D for(p=a;a<p+10; ++a);参考答案:B
17、在C语言程序中,以下说法正确的是( )。
A函数的定义可以嵌套,但函数的调用不可以嵌套 B函数的定义不可以嵌套,但函数的调用可以嵌套 C函数的定义和函数的调用都不可以嵌套 D函数的定义和函数的调用都可以嵌套参考答案:B
18、下面程序的输出结果()。
#include struct A{int i;char j;char *ptr;long Array[100];char b[2];char *c;};int main(){ printf("%d\n", sizeof(A)); return 0;}
A、415B、416C、420D、421参考答案:C
19、如下C程序输出的是()。
#include int mul(int a, int b, int c){ return a*b*c;}int main(void){ int (*function_pointer)(int, int, int); function_pointer = mul; printf("The product of three numbers is: %d", function_pointer(2, 3, 4)); return 0;}
A、不确定B、编译出错C、无输出D、The product of three numbers is: 24参考答案:D
20、设有如下枚举类型定义:
enum language { Basic=3, Assembly, Ada=100, COBOL, Fortran};
枚举变量Fortran的值为()。
A、4B、7C、102D、不确定参考答案:C
二、填空题
1、用变量m给出下面的定义一个整型数 int m;一个指向整型数的指针 int *m;一个指向指针的指针,它指向的指针是指向一个整型数 int *p = 10;int *m = p;一个有10个整型数的数组 int m[10];一个有10个指针的数组,该指针是指向一个整型数的 int *m[10]; m = 10;一个指向有10个整型数数组的指针 int (*p)[10];一个指向函数的指针,该函数有一个整型参数并返回一个整型数 int *m(int m){ return m;}一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数 int *m[10];m=m(x);m(int n){return n;}
2、以下程序的输出结果是 54321
#include int main(void) { int n=12345, d; while(n!=0) { d=n%10; printf("%d",d); n/=10; } }
3、给定结构
struct A{char t:4;char k:4;unsigned short i:8;unsigned long m;};sizeof(A) = 8。
4、若有以下定义,则p+5表示_元素a[5]的地址.
int a[10],*p=a;
5、写出以下两段程序的执行结果。如果程序无法编译,请指出出错部分并写明原因;如果程序陷入死循环,请回答“死循环”。
如果执行结果出现内存错误,请指出出错部分并写明原因。
int main(void) { char s[ ]="man"; int i; for(i=0; s[i]; i++) { printf("\n%c%c%c%c",s[i], *(s+i), *(i+s), i[s]); } }
(1) mmmm (2)aaaa (3)nnnn
三、简答题
1、以下程序的运行结果如何?原因?
void get_memory(char **p, int num){*p = (char *)malloc(num);}int main(void){char *str = NULL;get_memory(&str, 100);strcpy(str, "hello");printf("%s", str);}答:输出 hello 。
2、关键字static的作用是什么?
【参考答案】关键字static有三个明显的作用:
1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
3、头文件中的 ifndef/define/endif 干什么用?
【参考答案】防止该头文件被重复引用。
四、编程
1、定义一个整形变量a,并将a的第5位清0,第7位置1,其他位不变。
int a;a = a & (~(0x01 << 5));a = a | (0x01 << 7);
2、写一个函数,交换传进去的两个参数的值。
void swap(int *p1,int *p2){int temp;temp = *p1;*p1 = *p2;*p2 = temp;}