c语言面试题

时间:2022-05-14 14:27:47
1.以下变量x、y、z均为double类型且已正确赋值,不能正确表示数学式子x/(y*z)的C语言表达式是_______。

A)x/y*z    B)x*(1/(y*z))    C)x/y*1/z    D)x/y/z

答案:A

评析:按照自左向右的运算逻辑,选项A是先做x/y,然后再乘以x,显然与题意不符。


2.下列不合法的main函数命令行参数的表示形式是_______。

A)main(n a,char*c[]);        B)main(ac,av)int arc;char**av;

C)main(C,V)int c,char*v[];    D)main(argc,argv)int argc;char argv[];

答案:D

评析:main函数的参数通常有两个,前者为整型,后者为字符型指针数组。参数的名字可以是任意合法的标识符。而且,形如**av与*av[]等价,所以选项A、B、c均正确,选项D是错误的。

3.在c语言中,引用数组元素时,其数组下标的数据类型允许是_______。

A)整型常量               B)整型表达式

C)整型常量或整型表达式   D)任何类型的表达式

答案:C

评析:c语言规定只能逐个引用数组元素而不能一次引用整个数组,数据元素的表示形式为数组名[下标],下标可以是整型常量或整型表达式。

4.下列程序的输出结果是__________。

main()

{

char a[10]={9,8,7,6,5,4,3,2,1,O},*p=a+5;

print”%d*–p);

}

A)非法    B)a[4]的地址    C)5    D)3

答案:C

评析:本题中char*p=a+5;即相当于p=&a[5],而–p,是先要减1,则printf语句要输出的值就是a[4]。p是一个指针。

5.对下面的程序进行编译与连接生成可执行文件c.exe,并在DOS命令提示符下输入:

c I said”I loveChina”!

程序代码如下:

main(int argc,char*argv[])

{

printf(“%d”,argC);

}

其输出结果为________。

A)4    B)5    C)6    D)7

答案:B

评析:带参数的main()函数常用形式为:main(int argc,char*argv[])

其中,参数的个数由C程序运行时自动计算出来。字符型指针数组argv的第一个元素存放命令名,其后各个元素依次存放命令行中各个参数的首地址;整型变量arge用来记录命令行中的参数个数,文件名也作为一个参数,对于命令行中双引号内的字符串,即使有空格分开,也只算是一个参数,同时双引号本身不算参数的内容,因此本题argc的值等于

5.下列程序的运行结果是________。

void fun(int *a,int *b)

{

int *k:

k=a;a-b;b=k;

}

main()

{

int a=3,b=6,*x=&a,*y=&b;

fun(x,y);

printf[”%d%d.f,a,b);

}

A)6 3    B)36    C)编译出错    D)0 0

答案:B

评析:本题中主函数里的x、y,fun函数里的a、b、k,这些都是指针,fun函数中只是将a、b这两个指针交换了位置,而并没有改变主函数中变量a、b的值。


6.int *p[3] p是一个数组,此数组有3个元素,每个元素都是int*类型,也就是指向整型数据的指针类型。

int(*p)[3]中的p是一个指向数组的指针,此数组有3个int类型的元素。

7.下面的程序输出结果是________。

#define r16

#ifr==16

void p(int a)

{

printf(“%x”,a);

}

#else

voidp(int a)

{

printf(“%d”,a);

}

#endif

main()

{

p(32);

}

A)32    B)20    C)编译时错误  D)运行时错误

答案:B

评析:“#define r16”的作用是指定用标识符r来代替16,因此程序编译时只编译#if部分,故程序运行时,打印输出十六进制的32,即20。%o是八进制,%x是十六进制。0x是16进制。

8.设有以下声明语句

struct ex

{   intx;floaty;char z;}example;

则下面的叙述中不正确的是_________。

A)struct是结构体类型的关键字    B)example是结构体类型名

C)x,y,z都是结构体成员名       D)struct ex是结构体类型

答案:B

评析:example是结构体变量名。

9.以下只有在使用时才为该类型变量分配内存的存储类说明是_________。

A)auto和stmic           B)auto和register

C)register和static      D)extem和register

答案:B

评析:extem、register、static、auto分别是定义外部变量、寄存器变量、静态变量、自动变量,其中,自动变量和寄存器变量属于动态存储,调用时临时分配单元;而静态变量和外部变量属于静态存储,在整个程序运行时都存在。

10.当执行下面的程序时,其输出结果为__________。

union st

{

int a:

charb:

}

main()

{

union st s:

char*p=(char*)&s;

s.a=Ox3132;

s.b=Ox33;

printf(”%c”,*p);

}

A)l    B)2    C)3    D)不确定

答案:C

评析:共用体类型结构的特点是使几个不同的变量共占同一段内存,但在每一瞬时只能存放其中一种,而不是同时存放几种,共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。因此本题起作用的是成员b的值,所以程序打印输出3。此处ascii33的值是3.

11.main(im argo,char*argv[])

{

while(–argc>0)printf(”%s”,argv[argc]);

printf(”\n”);

}

假定以上程序经编译和连接后生成可执行文件PROG.ExE,如果在此可执行文件所

在目录的Dos提示符下键入:PROG ABcDEFGHIJKL↙,则输出结果为_________。

A)ABCDEFG          B)IJHL

C)ABCDEFGHIJKL     D)lJKLABCDEFGH

答案:C

评析:本题主函数带有两个参数,一个int型变量argc,另一个是char型的一维一级指针数组argv。当主函数被执行时,系统自动将根据命令行的情况,分别给主函数的两个参数赋值。Arge中存放命令行中命令字和参数的总和的个数,argv用来存放命令行中命令字和所有参数的字符串的,并规定argv[0]存放命令字字符串argv[1]用来存放第一个参数的字符串,argv[2]用来存放第2个参数的字符串,依次类推

题中argc的值是2,执行完–argc后为1,输出argv[1],此数组存在第一个参数的字符串ABCDEFGHIJKL。


10.用以下语句调用库函数malloc,使字符指针st指向具有11个字节的动态存储空间,    请填空。

st=(chhr*)  【8】 

答案:malloc(11)

评析:malloc函数的格式是:void*(或char*)malloc(size),size表示应分配的存储区。此题要分配11字节的单元,把11代入即可。


11.下列程序段的输出结果是  【9】 

main()

{char b[]=”Hello,you”;

b[5]=0;

printf(”%s\n”,b);

}

答案:【9】Hello

评析:字符串中,数值0或符号‘\O’表示字符串的结束。本题中,b[5]被赋了0值,表明字符串b的第六个字符就是结束标志。因此,只输出前五个字符,即Hello。


12.下列程序的输出结果是  【13】   。

void fun(int *n)

{

while((*n)–);//这里是空执行;而且是先判断,后自减,注意用笔计算下

printf(”%d”,++(*n));

}

main()

{  int  a=100;

fun(&a);

}

答案:【13】0

评析:在函数fun()中,while((*n)–)是先引用+n的值,再做(*n)–运算,所以循环结束时*n的值为O,再做(+n)–运算后,*n的值为-1;执行++(*n)后,*n的值是O。



13.static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。


14.char **p, a[16][8]; 

问:p=a是否会导致程序在以后出现问题?为什么?

编译就通不过,p是一个指针的指针,而a是一个2维数组的首地址。但是*p = a也是错误的。