int a=3,b=5; int *p,*q; p=&a; q=&b;
printf (\}
结果:8。
练习8_3:编写程序,实现从键盘输入两个数,输出时从大到小排列(利用指针概念), #include
int *p1,*p2,*p,a,b; scanf(\ p1=&a; p2=&b; if(a
{ p=p1; p1=p2; p2=p;} printf(\
printf(\}
练习8_4 有定义:int x,*p1=&x,*p2;,则能使得p2也指向x的语句是p2=p1。 练习8_5 若有定义:int i,j,*p,*q;,下面的赋值正确的是(D)
A、 *p=&i; B、 p=i; C、 i=&q; D、 p=&i; ▲三、指针与数组 ?指针和一维数组
数组名代表数组的首地址,是一个常量。
数组指针:就是指向数组元素地址的指针变量。
指向数组的指针变量可以与一个整型常量相加,或与一个整型常量相减。 ?指针和二维数组
用数组名表示二维数组的行地址 数组元素三种形式引用:
? a[i][j] 下标法
? *(a[i]+j) 用一维数组名 ? *(*(a+i)+j) 用二维数组名 ?指针数组
指针数组:数组的所有元素都是存放指针的数组称为指针数组。 即:指针数组中每一个元素(下标变量)都是指针变量。 指针数组的定义形式:
<存储类型> <数据类型> <*指针数组名>[数组长度][={地址列表}];
练习8_6 有定义:int a[6], *p1=a, *p2=p1;,则能够正确表示元素a[2]的是*(p2+2)或者*(p1+2)。
练习8_7 若已定义:int a[9],*p=a;,则表示a[1]地址的表达式是p+1(或a+1或++p)。 练习8_8 有定义:int a[10][10],*p=a[0],i,j;,其中i和j表示数组元素下标并在数组允许范围内,那么能够正确引用元素a[i][j]地址值的是*(p+i)+j或*(a+i)+j。
4、指针与字符串
?将字符串的首地址赋给指针,用字符指针变量来处理字符串。 ?字符指针变量与字符指针数组
- 26 -
字符数组和字符指针变量都能实现字符串的存储与运算,但两者之间还是有区别的,主要包括以下几点:
①字符数组由若干元素组成,每个元素存放一个字符; 字符指针变量存放的是字符串的首地址。 ②赋值方式不同:
不能用赋值语句给字符数组赋值。 char str[14];
str=“I love china!” 这是错误的。 字符指针变量可以采用下面的形式赋值: char *p;
p=“china!” 这是正确的。
但要注意赋给指针变量p的不是字符串,而是字符串的首地址。 定义一个数组,在编译时分配存放n个元素的存储空间; 定义指针变量只分配存放一个地址的空间。 练习8_9 写出下列程序的运行结果。 #include
void fun(int *x); int *p,y; y=3; p=&y; fun(p);
printf(\}
void fun(int *x) {
*x=9; }
结果:y=9。
练习8_10 写出下列程序的运行结果。 #include
void swap(int x,int *y) { int t; t=x; x=*y; *y=t; }
运行结果5,5
- 27 -
第九章 结构体、共用体与枚举类型
▲一、结构体
结构体是用户自定义的新数据类型,在结构体中可以包含若干个不同数据类型和不同意义的数据项(当然也可以相同),从而使这些数据项组合起来反映某一个信息。
1、定义一个结构体类型的一般形式为: struct 结构体名 {
数据类型 成员名1; 数据类型 成员名2; ??
数据类型 成员名n; };
例如:定义一个职工worker结构体如下: struct worker { long number; char name[20];
char sex; //sex是成员名 int age;
float salary; char address[80];
char phone[20]; }; //注意分号不要省略 int sex=10; //sex是变量名 2、结构体类型变量的定义方法
? 先定义结构体类型再定义变量名:struct 结构体名 变量名 ? 在定义结构体类型的同时定义变量。
注意:结构体的定义可以嵌套,即在结构体内还可以定义结构体。结构体中的成员也可以是一个结构体变量。
3、结构体变量的引用和初始化
? 结构体变量的引用:结构变量不能整体引用,只能引用其成员,一般形式为:结构体变量名.成员名。
? 结构体变量的初始化:struct 结构体名 变量名={初始数据表}; 或
struct 结构体名 {
成员列表;
}变量名={初始数据表}; 注意:
①结构体是一种构造数据类型,是数目固定,类型不同的若干有序变量的集合。 ②结构体变量占据的内存空间大小等于所有成员占据的内存空间之和。 二、共用体
1、共用体的概念
在C语言中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共用体,简称共用,又称联合体。
2、定义一个共用体类型的一般形式为: union 共用体名 {
成员列表; };
- 28 -
3、共用体变量的定义
? 先定义共用体类型再定义共用体变量:union 共用体名 变量名 ? 在定义共用体类型的同时定义变量。 练习9_1 写出下列程序的运行结果 #include
union data {
int i; char ch; float f; }a,b,c; a.i=9; b=a; c=b;
printf(\}
练习9_2写出下列程序的运行结果 #include
int y;
}a; a.x=3; a.y=6;
z=a.x+a.y;
printf(\}
结果:z=12 注意:
①共用体变量任何时刻只有一个成员存在。
②共用体变量定义分配内存,长度=最长成员所占字节数。 三、枚举
1、枚举的概念
枚举就是指将某一变量所有可能的取值一一列举出来。 2、枚举的定义:
enum 枚举类型名{枚举元素表}枚举变量名 3、枚举变量的定义
? 在定义枚举类型的同时,定义枚举类型的变量。 ? 已定义过的枚举数据类型定义枚举变量,格式为: enum 枚举名称 变量名表
练习9_3(若有定义enum name{a,b,c=1,d};则枚举常量a,d的值分别是0,2。 注意:
- 29 -
①枚举元素是常量,不能在程序中用赋值语句再对它赋值 ;
②枚举元素作为常量是有值的,编译系统按定义时的顺序使它们具有顺序整数值:0,1,2,??; ③在定义枚举类型中,可在枚举数据时通过“=”来对枚举元素进行初始化(指定一个整型值),并影响后面的枚举元素的值,后继序号以此递增;
③枚举元素不是字符常量也不是字符串常量,不能直接输入输出,可在过程中通过判断和强制类型转换来实现输入输出;
④枚举变量只能取对应枚举类型的枚举元素表中的元素; ⑤枚举元素表中的元素有先后次序,可以进行比较。 四、类型定义typedef的使用
用typedef定义新的类型名代替已有的类型名。 ?、格式:typedef 数据类型 新的名称
?、类型定义一般为大写,与原来的数据类型关键相区别
?、类型定义只是给已存在的数据类型增加一个类型名,并没有创造一个新的数据类型。 注意:
①使用typedef可以定义各种类型名,但不能用来定义变量;
②使用用typedef只是将已存在的类型用一个新的名称来代表,并不是定义了一种新的数据类型;
③使用typedef便于程序的通用。
第十章 文件
一、文件指针:
1、文件指针:C语言系统对文件的操作必须通过一个指向“FILE类型”的指针来实现,我们称这种指针为 “文件指针”。
二、文件位置指针
C语言规定:每一个文件都必须设置一个位置指针(文件指针)来控制文件的访问位置,其规律如下。
◆ 文件打开时指针自动指向文件的开始位置;
◆ 每读取一个单元内容文件位置指针自动顺序向后移动一定的偏移量(该偏移量的字节数由所读取单元的数据类型决定);
◆ 读到文件的结尾,则文件的位置指针指向一个特殊的位置——EOF。
◆ 对文件进行顺序写操作时,数据写入到文件位置指针所指向的位置。写入后文件位置指针自动向后移动到一个新的位置,等待下一次的写入操作。
◆ 可将文件位置指针移动到任何位置,实现对文件的随机读写访问。 三、文件的打开——打开文件函数fopen()
打开文件使用fopen()函数实现。打开文件格式为: FILE *fp;
fp= fopen(文件名,使用方式);
文件名:为包含访问路径的文件名字符串。 在C语言中,对文件操作必须先打开文件。若执行fopen()时发生错误,则函数的返回值是NULL或0。
四、关闭文件函数fclose()
文件操作结束前,必须关闭文件。
关闭文件使用fclose()函数。格式如下: fclose(文件指针) ;
其中的“文件指针”参数,就是保存打开文件操作时fopen函数返回值的FILE指针变量。 关闭文件的含义就是执行fclose()函数,先释放文件指针,后写缓冲区的数据到文件中。 当顺利执行了文件关闭操作时,fclose()返回值是0,否则返回-1。
- 30 -