协议开发四部C语言试题
(100分,时间30分钟)
姓名: : 分数:c语言中struct
说明:
1:以下各题均使用如下假设:int, long, short, char类型数分别为4字节、4字节、2字节、1字节,long long类型数为8字节,指针变量的size为4字节。
2:试题中许多变量命名直接用a,b,c等简化形式,本该用宏的地方也直接用了数字,是因为这里不用考虑变量和宏的具体含义。实际开发写代码时当然不允许这样做。
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、 死循环,不能确定次数
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);
A、73 B、80 C、10 D、74
3、 已知某系统架构下,C函数用栈传递参数,参数的入栈顺序为从右到左,且栈由高地址向低地址方向增长。那么在该系统下,下面的函数f的返回值为
( B )
int f(int a, int b)
{
return (&b - &a);
}
A、1 B、2 C、3 D、4
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;
如果CPU为big-endian, 那么结果a等于__0x4__, 如果cpu为little-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、 下面的语句执行后m和n的值分别为:___m=25,n=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小时内删除。
发表评论