您的位置:首页 > 编程语言 > C语言/C++

练习题答案

2016-12-13 22:03 204 查看
1、C 本题考查sizeof和strlen对字符串的处理不同之处,sizeof求出字符串的字符个数,包括结尾符。Strlen求出字符串的实际字符,不包括结尾符。所以答案为6,5,C选项正确。

2、A 函数fun 的功能是返回两个形参的和。调用函数fun(x,y)时,将变量x=6和y=7的值分别传送变量a和b,并且通过语句return a+b;将13返回给主函数。继续调用函数fun (13,z - -),这里z- -指将z的值参与运算后,再将z的值减1操作;将13和8分别传送变量a和b,且通过语句return a+b ;将21返回给主函数。因此A选项正确。

3、ABC

D为什是错的:

volatile 作用是避免编译器优化,说明它是随时会变的,它不是 non-const,和const不矛盾。被const修饰的变量只是在当前作用范围无法修改,但是可能被其它程序修改。所以

const volatile int i = 0; 表示:

任何对i的直接修改都是错误的,但是i可能被意外情况修改掉,不要做无意义的优化。

4、0x800002

0x800010

我们定义指针的时候给指针一个类型就是为了方便指针的加减操作。p1是char类型指针,每个char占一个字节,所以p1+2就是在p1的基础上加2个char的长度,就是两个字节。p2是指向64位int型的指针,所以p2+2就是p2加上两个64位int的长度,也就是加上128位,即16个字节。用16进制表示是0x10

所以a=0x800000+0x2=0x800002

a=0x800000+0x10=0x800010

5、D对于双向链表在插入的时候 要对两个指针进行操作,既next 和 prior 指针都要指定到位置

如图上所示 在a b 之间插入c 假设a 为p , c为s 在插入过程中

首先把p的下一个节点链接到s上:s->next = p->next

把p->next->prior 链接到s 上 :p->next->prior = s;

把s链接到p上:p->next = s;

把p链接到s->prior 上:s->prior = p;

具体顺序 看好指针别被覆盖就行。

对于上述选项中:

A p->next = s; s赋值给p->next , p->next ->prior = s ,p->next就是s 而s->prior还没确定

B s->prior = p; s->next = p ->next ; p ->next = s; p->next ->prior = s;跟a一样的问题

C p ->next = s;s ->prior = p; p->next ->prior =s; s ->next = p ->next;同a错误一样



1,register 请求编译器尽可能把变量保存在cpu内部寄存器中而省去内存抓取数据的的时间来加快运行速率,一般将频繁被使用的变量声明为register;

使用注意点: 1,不能取地址来获取

2,是cpu所接受的数据类型

3,只能修饰局部变量,不能修饰全局变量和函数,静态变量。

2,进程间通信方式包括:

管道(pipe)和有名管道

管道是单向的,先进先出的,提供了简单的流控制。进程读空管道或写满管道,都将造成进程阻塞。

管道包括无名管道和有名管道。前者用于父子进程间通信,后者用于任意两个进程间通信。

信号(signal):产生信号的条件:按键、硬件异常、进程调用Kill函数将信号发送给另一个进程、用户调用Kill命令将信号发送给其他进程。

消息队列 (又称报文队列):一个消息链表,可以把消息看做一个记录,具有特定的格式。进程可以向队列中添加消息或读走消息。

共享内存:被多个进程共享的一部分物理内存,共享内存是进程间共享数据的一种最快的方法。

信号量:主要用于保护临界资源。进程可以根据它来判断是否能够访问某些共享资源。除了用于访问控制外,还可用于进程同步。

套接字(socket)

一种文件描述符。有三种类型:

(1)流式套接字:提供可靠地,面向连接的通讯流。

(2)数据报套接字:定义一种无连接的服务,通过相互独立的报文进行传输,是无序的。

(3)原始套接字:用于新的网络协议的测试。

3,



1.strcpy的实现代码

char * strcpy(char *dst,const char *src) //[1]

{

assert(dst != NULL && src != NULL); //[2]

char *ret = dst; //[3]

while ((*dst++=*src++)!='\0'); //[4]

return ret;

}

[1]const修饰

源字符串参数用const修饰,防止修改源字符串。

[2]空指针检查

(A)不检查指针的有效性,说明答题者不注重代码的健壮性。

(B)检查指针的有效性时使用assert(!dst && !src);

char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。

(C)检查指针的有效性时使用assert(dst != 0 && src != 0);

直接使用常量(如本例中的0)会减少程序的可维护性。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。

[3]返回目标地址

(A)忘记保存原始的strdst值。

[4]'\0'

(A)循环写成while (*dst++=*src++);明显是错误的。

(B)循环写成while (*src!='\0') *dst++=*src++;

循环体结束后,dst字符串的末尾没有正确地加上'\0'。

2、
http://www.cnblogs.com/en-heng/p/3973679.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言