选择题
1. B 静态链表用数组模拟链表,使用数组下标表示指针
2. D 线程是进程的组成部分,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
3. B
选择题4:C TCP协议将应用层的字节流分成多个字段
选择题5:D 不一一叙述
简答题1:简述数组与指针的区别?
答:数组是一连续的记忆体区块,必须要先决定配置容量和存放的资料型态。
当数组作为函数的参数进行传递时,数组就自动退化为通指针类型
指针是指针变量的简称,这个变量存放的地址值,是可以改变的;
简答题:
2.const 含义:限定一个变量不允许被改变,产生静态作用
作用:const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。
被Const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
(1)修饰普通变量 const无论是放在数据类型的前面还是后面,都是将变量饰为常量
(2)和指针变量结合使用,从constk开始往右看,先遇到*p则*p不可以被改变,先遇到p,p不能被改变
3.const与#define相比,有何优点
①define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。
②const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了
4.
预编译就是指程序执行前的一些预处理工作,主要指#表示的。
1.总是使用不经常改动的大型代码体。
2.程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。
编辑
文件包含有两种格式,分别是:#include"file" 和#include
这两格式的区别在于:
1.使用双引号,系统首先到当前目录下查找被包含的文件,如果没找到,再到系统指定的"包含文件目录"(由用户在配置环境时设置)去找。
2.使用尖括号:直接到系统指定的"包含文件目录"去查找。
通常使用双引号比较保险
编辑
一个大程序,通常分为多个模块,并由多个程序员分别编程。有了文件包含处理功能,就可以将多个模块共用的数据(如符号常量和数据结构)或函数,集中到一个单独的文件中。这样,凡是要使用其中数据或调用其中函数的程序员,只要使用文件包含处理功能,将所需文件包含进来即可,不必再重复定义它们,从而减少重复劳动和定义不一致造成的错误。
编辑
文件F1.c
?
1 2 3 4 5 |
#define PI 3.1415926
#define R 3
#define S PI*R*R |
文件F2.c
?
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include "F1.c"
#include "stdio.h"
main()
{
float area=0;
printf("area=%f\n",S);
} |
在VC++6.0的运行结果为:
?
1 |
area=28.274333 |
编辑
文件包含的特点:
① 编译预处理时,预处理程序将查找指定的被包含文件,并将其复制插入到#include命令出现的位置上
② 常用在文件头部的被包含文件,称为“标题文件”或“头部文件”,常以“h”(head)作为后缀,简称头文件。在头文件中,除可包含宏定义外,还可包含外部变量定义、结构类型定义等。
③ 一条包含命令,只能指定一个被包含文件。如果要包含多个文件,则要用多条包含命令。例如,文件f1.h中要使用到文件f2.h和文件f3.h的内容,则可在文件f1.h中用两个文件包含命令分别包含文件f2.h和文件f3.h,即在文件f1.h中定义:
#include"f2.h"
#include"f3.h"
在使用多个#include命令时,顺序是一个值得注意的问题。上例中,如果文件f1.h包含文件f2.h,而文件2要用到文件f3.h,则在f1.h中#include定义的顺序应该是:
#include"f3.h"
#include"f2.h"
这样文件f1.c和文件f2.h都可以使用文件f3.h的内容。
④ 文件包含可以嵌套,即被包含文件中又包含另一个文件。例如,文件f2.h中要使用到文件f1.h的内容,文件f3.h要使用到文件f2.h的内容,则可在文件f2.h中用#include"f1.h"命令,在文件f3.h中用#include"f2.h"命令,即定义如下:
文件f1.h:
{
……
}
文件f2.h:
#include"f1.h"
intmax()
{
……
}
文件f3.h:
#include"f2.h"
main
{
……
}
#include命令一般用来把C语言提供的标准库头文件(如stdio.h、math.h)包含到程序中。程序员也可以自己定义一个头文件,写入一些常用的函数原型、宏定义、结构和联合类型定义等,然后将它包含到程序中。例如:#include"stdio.h" (标准输入/输出函数库)
#include"math.h" (数学函数库)
#include"stdlib.h" (常用函数库)
#include"string.h" (字符串处理函数库)
int a[5] : {1,2,3,4,5};
数组名a代表整个数组的地址,其值与数组中第一个元素的地址相同。
a+1相当于一个指向数组a的指针往后位移一个元素的距离。
*+(指针)== 指针指向地址中的内容。
printf( “%d”, *(a+1)) === 2;
&a为整个数组的地址+1后,相当于一个指向数组a的指针往后位移整个数组的距离。即int* ptr = (int*)(&a+1);
ptr-1是指针ptr往前移动一个单位(int型指针,移动单位为4字节)。
最后指向数组中的5。
printf(“%d”, *(ptr-1));===5
第二题:
主函数中调用了abc函数,将字符串str的地址传给了abc函数,
在abc函数中,利用a做字符数组str的下标,遍历字符串,将字符串中不是字符‘c’的其余字符,利用循环,重新赋值给字符数组str中下标为b的数组元素。