协议开发四部C语言试题
100分,时间30分钟)
姓名:                                  分数:c语言中struct         
说明:
1:以下各题均使用如下假设:int, long, short, char类型数分别为4字节、4字节、2字节、1字节,long long类型数为8字节,指针变量的size4字节。
2:试题中许多变量命名直接用abc等简化形式,本该用宏的地方也直接用了数字,是因为这里不用考虑变量和宏的具体含义。实际开发写代码时当然不允许这样做。
3对齐方式假设是4字节对齐
一、不定项选择题(每题5分,共4题,20分)
1、 以下程序中,while循环的循环次数是                          ( D
int main(int argc, char* argv[])
{
    int i=0;
    while(i<10)
    {
        if(i<1) continue;
        if(i==5) break;
        i++;
    }
    return 0;
}
  A 1   B、 10  C 6    D 死循环,不能确定次数
       
2、 以下不能对二下面代码的输出结果为                                  (  )
typedef struct
{
  WORD32 x;
  WORD16 y;
  WORD16 z;
}T_Pos;
T_Pos  atPoints[64];
T_Pos *ptPos=atPoints;
BYTE  *pucPos2=(BYTE*)&atPoints[10];
ptPos++;
pucPos2++;
printf("%d",(int)pucPos2-(int)ptPos);
A73    B80      C10    D74
3、 已知某系统架构下,C函数用栈传递参数,参数的入栈顺序为从右到左,且栈由高地址向低地址方向增长。那么在该系统下,下面的函数f的返回值为                               
                                                                    ( B  )
int f(int a, int b)
{
    return (&b - &a);
}
A1    B2    C3    D4
4、 有以下函数:
void example(char acHello[])
{
  printf(%d, sizeof(acHello));
  return ;
}
void main()
{
  char acHello [] = Hello;
  example(acHello);
  return ;
}
上述程序的输出是                                              (  A  )
A 4          B 5          C 6          D 不确定
二、填空题(每题5分,共4题,20分)
1、 有以下定义:
int a = 0x456;
  int b = 0x123;
char *p =  (char *)&a;
*p = b;
如果CPUbig-endian, 那么结果a等于__0x4__, 如果cpulittle-endian,那么结果a等于___0x56__
2、 下面代码执行的结果是:___15_____
int a[3][3]={{1,2},{3,4},{5,6}},i,j,s=1;
for(i=1;i<3;i++)
for(j=0;j<i;j++)
s+=a[i][j];
printf("%d\n",s);
3、 问如下函数输出:____8____
void fun(void)
{
    int count=0;
    int m=9999;
    while(m)
  {
        count++;
          m=m&(m-1);
  }
    printf("%d",count);
}
4、 下面的语句执行后mn的值分别为:___m=25n=5_____
#define  SQUARE(A)  (( A ) * ( A ))
#define SQUARE2(A)  (A*A)
int  i = 3,j=2;
int m = SQUARE(++i);
int n= SQUARE2(j+1);
三、判断题(每题5分,共2题,10分,正确为T,错误为F
1、 指向指针的指针及更多级的指针,只需要检查最后一级指针就可以了。      T
2、 一个C文件中定义了一个数组char a[10]; 其它文件要访问这个数组,只要这样声名:extern char a[]或者extern char *a,并且保证下标不出界就可以了? (  T
四、分析题(每题20分,共1题,20分)
struct S
{
  int i;
  int * p;
};
void main()
{
  S s;
  int * p = &s.i;
  p[0] = 4; 
p[1] = 3;   
s.p = p;
s.p[1] = 1;
s.p[0] = 2; 
}
请给出程序的执行结果,并写出原因。
答:程序异常,结果无法显示。
原因:
五、编码题(每题30分,共1题,30分)分值中功能占80%,编程规范占20%
编写一个链表反序的函数。
struct node
{
struct node *next;
int data;
};
函数原型如下:struct node* Reverse(struct node *pHead);
其中pHead为需要反转的链表头指针,链表以NULL为结尾,返回值为反转后的链表头指针,要注意异常处理。
node* Reverse(struct node *pHead)
{   
  node* PreNode
if(!pHead)          /*如果当前节点指针为空,则返回NULL,此种情况只有在*/
return NULL;                               /*链表头指针为空时才可能执行到*/
if(!pHead ->next)                       
/*如果下一节点指针为空,则将当前节点next指针指向上一节点,并返回当前节点指针,次种情况只有在当前节点为尾节点时才能执行到*/
{       
pHead ->next=PreNode;
return pHead;
}
else           /*其他节点的情况,先调用递归函数反转后续节点,再反转当前节点*/
{                              /*并将递归函数返回来的尾节点指针向上层函数返回*/
 node * FirstNode;
FirstNode=Reverse(pHead);
pHead ->next=PreNode;
return FirstNode;          /*返回的是尾节点的指针,即反转后新链表的头指针*/
  }
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。