按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
p 为带回一个指针的函数,该指针指向整型数据
p 为指向函数的指针,该函数返回一个整型值
P 是一个指针变量,它指向一个指向整型数据的指针变量
10。8。2 指针运算的小结
现把全部指针运算列出如下:
1) 指针变量加(减)一个整数:
谭浩强 C 语言程序设计 2001 年 5 月 1 日
例如:p++、p……、p+i、p…i、p+=i、p…=i
一个指针变量加(减)一个整数并不是简单地将原值加(减)一个整数,而是将该指针
变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数加(减)。
2) 指针变量赋值:将一个变量的地址赋给一个指针变量。
p=&a; (将变量 a 的地址赋给 p)
p=array; (将数组 array 的首地址赋给 p)
p=&array'i'; (将数组 array 第 i 个元素的地址赋给 p)
p=max; (max 为已定义的函数,将 max 的入口地址赋给 p)
p1=p2; (p1 和 p2 都是指针变量,将 p2 的值赋给 p1)
注意:不能如下:
p=1000;
3) 指针变量可以有空值,即该指针变量不指向任何变量:
p=NULL;
4) 两个指针变量可以相减:如果两个指针变量指向同一个数组的元素,则两个指针变量值
之差是两个指针之间的元素个数。
5) 两个指针变量比较:如果两个指针变量指向同一个数组的元素,则两个指针变量可以进
行比较。指向前面的元素的指针变量“小于” 指向后面的元素的指针变量。
10。8。3 void 指针类型
ANSI 新标准增加了一种“void”指针类型,即可以定义一个指针变量,但不指定它是指向
哪一种类型数据。
11 结构体与共用体
11。1 定义一个结构的一般形式
在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为
字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。 显
然不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于
编 译 系 统 处 理 。 为 了 解 决 这 个 问 题 , C 语 言 中 给 出 了 另 一 种 构 造 数 据 类 型 ——“ 结 构
(structure)”或叫“结构体”。 它相当于其它高级语言中的记录。“结构”是一种构造类型,
它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结
构既是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。
如同在说明和调用函数之前要先定义函数一样。
定义一个结构的一般形式为:
struct 结构名
{成员表列};
成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须
作类型说明,其形式为:
类型说明符 成员名;
成员名的命名应符合标识符的书写规定。例如:
struct stu
{
int num;
char name'20';
char sex;
float score;
};
在这个结构定义中,结构名为 stu,该结构由 4 个成员组成。第一个成员为 num,整型变
量;第二个成员为 name,字符数组;第三个成员为 sex,字符变量;第四个成员为 score,
实型变量。应注意在括号后的分号是不可少的。结构定义之后,即可进行变量说明。凡说明
为结构 stu 的变量都由上述 4 个成员组成。由此可见, 结构是一种复杂的数据类型,是数目
固定,类型不同的若干有序变量的集合。
11。2 结构类型变量的说明
说明结构变量有以下三种方法。以上面定义的 stu 为例来加以说明。
1。 先定义结构,再说明结构变量。
如:
struct stu
{
int num;
char name'20';
char sex;
float score;
};
struct stu boy1;boy2;
说明了两个变量 boy1 和 boy2 为 stu 结构类型。也可以用宏定义使一个符号常量来表示
一个结构类型。
例如:
#define STU struct stu
STU
{
int num;
char name'20';
char sex;
float score;
};
STU boy1;boy2;
2。 在定义结构类型的同时说明结构变量。
例如:
struct stu
{
int num;
char name'20';
char sex;
float score;
}boy1;boy2;
这种形式的说明的一般形式为:
struct 结构名
{
成员表列
}变量名表列;
3。 直接说明结构变量。
例如:
struct
{
int num;
char name'20';
char sex;
float score;
}boy1;boy2;
这种形式的说明的一般形式为:
struct
{
成员表列
}变量名表列;
第三种方法与第二种方法的区别在于第三种方法中省去了结构名,而直接给出结构变量。
三种方法中说明的 boy1;boy2 变量都具有下图所示的结构。
说明了 boy1;boy2 变量为 stu 类型后,即可向这两个变量中的各个成员赋值。在上述 stu
结构定义中,所有的成员都是基本数据类型或数组类型。
成员也可以又是一个结构,即构成了嵌套的结构。例如,下图给出了另一个数据结构。
按图可给出以下结构定义:
struct date
{
int month;
int day;
int year;
};
struct{
int num;
char name'20';
char sex;
struct date birthday;
float score;
}boy1;boy2;
首先定义一个结构 date,由 month(月)、day(日)、year(年) 三个成员组成。 在定义并
说明变量 boy1 和 boy2 时,其中的成员 birthday 被说明为 data 结构类型。成员名可与程
序中其它变量同名,互不干扰。
11。3 结构变量成员的表示方法
在程序中使用结构变量时,往往不把它作为一个整体来使用。在 ANSI C 中除了允许具有
相同类型的结构变量相互赋值以外,一般对结构变量的使用,包括赋值、输入、输出、运算
等都是通过结构变量的成员来实现的。
表示结构变量成员的一般形式是:
结构变量名。成员名
例如:
boy1。num 即第一个人的学号
boy2。sex 即第二个人的性别
如果成员本身又是一个结构则必须逐级找到最低级的成员才能使用。
例如:
boy1。birthday。month
即第一个人出生的月份成员可以在程序中单独使用,与普通变量完全相同。
11。4 结构变量的赋值
结构变量的赋值就是给各成员赋值。可用输入语句或赋值语句来完成。
【例 11。1】给结构变量赋值并输出其值。
main()
{
struct stu
{
int num;
char *name;
char sex;
float score;
} boy1;boy2;
boy1。num=102;
boy1。name=〃Zhang ping〃;
printf(〃input sex and scoren〃);
scanf(〃%c %f〃;&boy1。sex;&boy1。score);
boy2=boy1;
printf(〃Number=%dnName=%sn〃;boy2。num;boy2。name);
printf(〃Sex=%cnScore=%fn〃;boy2。sex;boy2。score);
}
本程序中用赋值语句给 num 和 name 两个成员赋值,name 是一个字符串指针变量。用 scanf
函数动态地输入 sex 和 score 成员值,然后把 boy1 的所有成员的值整体赋予 boy2。最后分
别输出 boy2 的各个成员值。本例表示了结构变量的赋值、输入和输出的方法。
11。5 结构变量的初始化
和其他类型变量一样,对结构变量可以在定义时进行初始化赋值。
【例 11。2】对结构变量初始化。
main()
{
struct stu /*定义结构*/
{
int num;
char *name;
char sex;
float score;
}boy2;boy1={102;〃Zhang ping〃;'M';78。5};
boy2=boy1;
printf(〃Number=%dnName=%sn〃;boy2。num;boy2。name);
printf(〃Sex=%cnScore=%fn〃;boy2。sex;boy2。score);
}
本例中,boy2;boy1 均被定义为外部结构变量,并对 boy1 作了初始化赋值。在 main 函
数中,把 boy1 的值整体赋予 boy2,然后用两个 printf 语句输出 boy2 各成员的值。
11。6 结构数组的定义
数组的元素也可以是结构类型的。因此可以构成结构型数组。结构数组的每一个元素都
是具有相同结构类型的下标结构变量。在实际应用中,经常用结构数组来表示具有相同数据
结构的一个群体。如一个班的学生档案,一个车间职工的工资表等。
方法和结构变量相似,只需说明它为数组类型即可。
例如:
struct stu
{
int num;
char *name;
char sex;
float score;
}boy'5';
定义了一个结构数组 boy,共有 5 个元素,boy'0'~boy'4'。每个数组元素都具有 struct
stu 的结构形式。对结构数组可以作初始化赋值。
例如:
struct stu
{
int num;
char *name;
char sex;
float score;
}boy'5'={
{101;〃Li ping〃;〃M〃;45};
{102;〃Zhang ping〃;〃M〃;62。5};
{103;〃He fang〃;〃F〃;92。5};
{104;〃Cheng ling〃;〃F〃;87};
{105;〃Wang ming〃;〃M〃;58};
}
当对全部元素作初始化赋值时,也可不给出数组长度。
【例 11。3】计算学生的平均成绩和不及格的人数。
struct stu
{
int num;
char *name;
char sex;
float score;
}boy'5'={
{101;〃Li ping〃;'M';45};
{102;〃Zhang ping〃;'M';62。5};
{103;〃He fang〃;'F';92。5};
{104;〃Cheng ling〃;'F';87};
{105;〃Wang ming〃;'M';58};
};
main()
{
int i;c=0;
float ave;s=0;
for(i=0;i