一份c语言选择题

1、给出以下定义:

       char acX[] = “abcdefg”;

       char acY[] = {‘a’,’b’,’c’,’d’,’e’,’f’,’g’};

   则正确的叙述为(  C  )

       A) 数组acX和数组acY等价            B) 数组acX和数组acY的长度相同

       C) 数组acX的长度大于数组acY的长度  D) 数组acX的长度小于数组acY的长度

 答案解析:    acX多一个‘\0’

void example(char acHello[])

   {

printf(“%d”,sizeof(acHello));

return;

}

void main()

{

char acHello[] = “hello,Bit”;

example(acHello);

return;

}

的输出结果是(  A  )

A) 4          B)12          C) 13          D)不确定

答案解析:  数组名传参,传的是首元数的地址,实际上形参也是一个地址,故sizeof(地址)=4

3、以下叙述中不正确的是(  D  )

       A) 在不同的函数中可以使用相同名字的变量

       B) 函数中的形式参数是在栈中保存

       C) 在一个函数内定义的变量只在本函数范围内有效

 D) 在一个函数内复合语句中定义的变量在本函数范围内有效(复合语句指函数中的成对括号构成的代码)

答案解析:

4、设有如下定义:

   unsigned long pulArray[] = {6,7,8,9,10};

unsigned long *pulPtr;

则下列程序段的输出结果为(  C  )

pulPtr = pulArray;

*(pulPtr + 3) += 3;

printf(“%d ,%d\n”,*pulPtr, *(pulPtr + 3));

A) 9,12         B) 6,9          C) 6,12          D)6,10

答案解析  *(pulPtr+3)=*(pulPtr+3)+3 意思是解引用拿到下标为3的数字9然后+3放在

下标为3的位置下 故 *(pulPtr + 3)=12; 而此时指针pulPtr仍旧指向首元素地址。就像a+3,a

的值是不变的。

5、void example()

   {

int i;

char acNew[20];

for(i = 0; i < 5; i++)

{

acNew[i] = ‘0’;

}

printf(“%d\n”,strlen(acNew));

return ;

}

的输出结果为(  D  )

A) 0          B) 5         C) 6          D)不确定

数组未初始化,里面放的全是随机值,而字符0和\0是不同的。

6、全局变量可以定义在被多个 .C 文件包含着的头文件中(  B  )

A) 正确         B)错误     

会出现重定义

struct stu

   {

int num;

char name[10];

int age;

};

void fun(struct stu *p)

{

printf(“%s\n”,(*p).name);

return;

}

void main()

{

struct stu students[3] = {{9801,”zhang”,20},

{9802,”wang”,19},

{9803,”zhao”,18}};

            fun(students + 1);

return ;

}

的输出结果为(  C  )

A) zhang         B)zhao         C) wang          D)18

数组名其实是首元素的地址,只要两种特殊情况1 sizeof(数组名)求的是所有元素的字节大小

2&数组名,取出的整个数组的地址。 所以当数组名students+1传参传的是数组中第二个元素。

 #include<stdio.h>

   void main()

{

union

{

short k;

char i[2];

}*s, a;

s = &a;

s->i[0] = 0x39;

s->i[1] = 0x38;

printf(“%x\n”,a.k);

}

输出结果是(  A  )

A) 3839          B) 3938         C) 380039          D)不确定

答案解析,电脑一般是小端模式,低位存放在低地址

 

9、下列定义正确的有(多选):( ABF   )

   A: char *pcPtr = “abcd”;

   B: char pc[] = “abcd”;

   C: char pc[4] = “abcd”;

   D: char pc[] = ‘abcd’;

   E: char pc[] = ‘a’’b’’c’’d’;

   F: char pc[] = {‘a’,’b’,’c’,’d’,’\0’};

这题属实没啥好说的== 

10、设有以下宏定义:

    #define N 4

    #define Y(n) ((N+2)*n) /*这种定义在编程规范中是严格禁止的*/

    则执行语句:z = 2 * (N + Y(5+1));后,z的值为(  D  )

A) 80         B) 60        C) 48          D) 70

涉及到宏定义展开: 5+1直接带入,不是6代入

z=2*(4+(4+2)*5+1)   则结果为70   

#define BUF_LEN  2048

    struct AAA

{

unsigned long ulLen;  //

   char buf[BUF_LEN];

};

函数PrintBufLen的作用是打印出结构体中buf的实际占用长度,有下面两种实现方法:

方法一:

void PrintBufLen(struct AAA *pBuf)

{

if(NULL == pBuf)

{

printf(“Error,pBuf is NULL.\n”);

return;

}

printf(“len = %u\n”,pBuf->ulLen);

return;

}

方法二:

void PrintBufLen(struct AAA Buf)

{

printf(“len = %u \n”,Buf.ulLen);

return;

}

以下说法只有一个正确的是(  A  )

A: 优选方法一,原因是以指针作为入参,减少函数参数压栈的系统开销

B: 优选方法二,原因是可以不做入参合法性判断,不容易出错

   C: 两种方法一样,可以任选一种

D: 以上说法都不对

答案解析:传址,不用开辟额外的空间,

 12、void main()

{

unsigned char a = 200;

unsigned char b = 100;

unsigned char c = 0;

c = a + b;

printf(“%d %d”, a+b,c);

}

程序的执行结果为(  C  )

A) 300 300        B) 44 44        C) 300 44         D) 44 300

答案解析: 无符号char的取值范围是0---255;放在c里面溢出了255

具体的计算要涉及的原码,反码,补码,如果想了解,可以问我,我会回答的。

  #define MAX_SIZE  A+B

struct _Record_Struct

{

unsigned char Env_Alarm_ID : 4;

unsigned char Para1 : 2;

unsigned char state;

unsigned char avail : 1;

}*Env_Alarm_Record;

struct _Record_Struct *pointer = (struct _Record_Struct*)malloc

(sizeof(struct _Record_Struct) * MAX_SIZE);

       当A=2, B=3时,pointer分配(  D  )个字节的空间。

A) 20       B) 15        C) 11         D) 9

答案解析  位段是3个字节大小,然后又是宏定义展开,上面说过

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通过全部用例

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值