C语言第九章

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

注意: 不同类型的结构变量不允许相互赋值,即使两者包含有 相同的成员。 在C 中结构类型名必须包含关键字struct,故定义语 句为:
struct person worker,manager;
结构变量的初始化与数组变量的初始化相同。
各成员的初始值列在花括号中,并由逗号隔开。
§9.2 结构与指针
结构变量的成员可以通过点操作符进行访问,也可以通过 指针进行访问。 若定义一个结构指针,并把一个结构变量的地址赋给它, 则通过该指针可对结构变量的成员进行访问。 结构指针定义格式如下: struct person *p; /* 定义指向结构类型的指针 */ struct person pr1; /* 定义结构类型变量 */ 若p=&pr1;则p 是指向结构变量pr1 的结构指针,为访问成 员,可写成: (*p).name 等效于 p->name; (*p).id 等效于 p->id; (*p).salary 等效于 p->salary.
在使用指针访问成员时,通常使用箭头操作符“->”。 例如:下面程序中,定义了结构指针,通过结构指针访问结构成员。
#include <stdio.h> 源自文库include <string.h> struct person
{
char name[20]; unsigned long id; float salary;
9
第九章
结构、联合、枚举 及类型定义
第九章 目 录
§9.1 结构 §9.2 结构与指 针 9.3 结构与数 § 组 9.4 § 传递结构参 数9.5 § 结构型函数 §9.6 结构指针型函数 §9.7 位域
§9.8 链表结构 §9.9 联合(Union)
§9.10 枚举(enum) §9.11 类型定义 第九章小结
数组中每个元素是一个完整的结构变量,它包含name、 id、salary三个成员分量。
allone[0] 访问第一个数组元素; allone[99]访问最后一个数组元素。
例如:下面程序对一个person 结构数组中的元素进行“冒泡 法”排序,工资高的排在后面。
#include <stdio.h> struct person { char name[20]; unsigned long id; float salary; }
结果为: Wang ming 12345678 4800.0
};
main( )
{
struct person pr1; struct person *p; p=&pr1; strcpy(p->name, “Wang ming”); p->id=12345678; p->salary=4800.0; printf(”%s\t%ul\t%f”,p->name,p->id,p->salary);
}
§9.3 结构与数组
如果一个数组的元素是同一种结构类型的变量,那么这种 数组称为结构数组。
要定义一个结构数组,必须先定义一个结构类型,然后再 定义具有这种结构类型的一个数组。
例如,定义一个包含100个元素的person 结构数组:
struct person { char name[20]; unsigned long id; float salary; } struct person allone[100];
{
for(int i=0;i<4;i++) print(allone[i]); /* 实参数为结构数组元素 */
结果为: jone
}
david marit yoke
12345 13916 27519 12335
3390.0 4490.5 3110.0 5110.0
二、传递结构变量的地址 结构变量也可以按传址方式传递,此时仅把实参的地址传给 形参。由于传递的是地址,可以实现由形参直接修改实参的作用。 传址方式没有传值方式的拷贝数据过程,节省了传送时间和 所需的存储空间,传递效率较高。 例如,将前面的程序改为传址方式传递结构变量,只需定义 print( )函数时,将形参说明为指针, 其函数调用方式改为传递实 参地址。
struct person { char name[10]; int age; float wage; };
• • • • • •
struct Date //日期 { int year;int month;int day;}; struct Circle //圆 { int x,y; float y; };
三、结构变量赋值 数组不能彼此赋值,但同类型的结构变量可以彼此赋值。
例如下面程序对结构变量赋值:
#include <stdio.h> struct person { 结果: char name[20]; Li ming 1082422 5300.0 unsigned long id; float salary; } struct person pr1={“Li ming”, 1082422, 5300.0}; main( ) { struct person pr2; pr2=pr1; /* assigning pr1 to pr2 */ printf(”%s\t%ul\t%f”,pr2.name,pr2.id,pr2.salary); }
}
struct person allone[4]={{“jone”,12345,3390.0}, {“david”,13916,4490.5}, {“marit”,27519,3110.0}, {“yoke”,12335,5110.0}}; main( )
{
for(int i=0;i<4;i++) print(&allone[i]); /* 实参数为结构数组元素的地址 */
§9.4 传递结构参数
结构变量也可以作为实参数进行函数调用。可以采用传值、 传址两种方式传递参数。 一、传递结构变量值 因为传递的是实参结构变量中拷贝的数值,所以实参结构 变量的数值不会因为函数的调用而被修改。 例如:下面是一个传值调用的例子
#include <stdio.h> struct person { char name[20]; unsiged long id; float saslary; };
#include <stdio.h> struct person { char name[20]; unsiged long id; float saslary; };
void print(struct person *pr)
{
printf(“”%s\t\t%ul\t\t%f”,pr->name, pr->id ,pr->salary);
} }
for(int k=0;k<6;k++) printf(“”%s\t\t%ul\t\t%f”,allone[k].name, allone[k].id ,allone[k].salary);
}
运行结果为: marit jone peter david yoke jasen 27519 12345 23987 13916 12335 42876 3110.0 3390.0 4000.2 4490.5 5110.0 6230.5
struct person allone[6]={{“jone”,12345,3390.0}, {“david”,13916,4490.5}, {“marit”,27519,3110.0}, {“jasen”,42876,6230.5}, {“peter”,23987,4000.2}, {“yoke”,12335,5110.0}}; main( )
struct person worker;
变量一旦定义,编译器将为woker 变量分配 包含三种不同数据类型成员的存储空间,如 右图所示:
name …… …… age …… …… wage …… ……
二、结构成员的访问
the individual members of struct variable can be accessed using the dot operator “.”.
第九章 结构
前面已介绍了整型、实型、字符型等基本数据类型。
介绍了处理相同数据类型数据集合的数组。 对于处理具有某种联系,可以由不同类型的数据项组成 的复杂数据类型,C称为结构。
本章内容包括结构类型及变量的定义,访问结构的成员 方法,结构作为参数传递的函数调用及返回结构的函数等。
§9.1 结构
一、结构及结构变量的定义
An array is an aggregate of the same type. A struct is an aggregate of elements of arbitrary types.
例如,要表示一个单位职工的收入情况,需要记录每个职 工的姓名、年龄、工资等信息。当用结构类型表示时,结构中 应包括一个字符串分量(表示姓名),一个整型分量(表示年龄), 一个浮点型分量(表示工资)。按C规定,可做如下定义:
{
struct person temp; for(int i=1; i<6;i++) /* 排序轮次数 */
{
for(int j=0;j<=5-i;j++) /* 一轮中比较 */ if(allone[j].salary>allone[j+1].salary) /*工资高后移*/
{
temp=allone[j]; allone[j]=allone[j+1]; alone[j+1]=temp;
void print(struct person pr)
{
printf(”%s\t\t%ul\t\t%f”,pr.name, pr.id ,pr.salary);
}
struct person allone[4]={{“jone”,12345,3390.0}, {“david”,13916,4490.5}, {“marit”,27519,3110.0}, {“yoke”,12335,5110.0}}; main( )
结果为:
}
jone david marit yoke
12345 13916 27519 12335
3390.0 4490.5 3110.0 5110.0
§9.5 结构型函数
返回值为结构类型的函数称为结构型函数。
一个函数可以返回一个结构变量。在main( )中,调用结 构函数的返回值必须赋于具有相同结构类型的变量。 定义的一般形式是:
其中,struct 是关键字;
person 是自定义的结构类型的名称;
花括号中是结构成员的说明。 类型定义通常位于main( )函数之前,使 该类型在定义点后面的程序中可见。
struct person 结构类型被定义后,从
使用角度看,就等效于int,char,float等基 本数据类型。
要使用结构变量也必须先定义后使用, 例如:
一般形式:结构变量名. 结构成员名
例如:
worker.age=25; scanf(”%s\n”,worker.name); printf(”%d\n”,worker.age);
下面是一个定义结构类型和变量的简单例子:
#include<stdio.h> struct weather { float temp; int wind; 结果: }; Temp=25.5 main( ) { Wind=4 struct weather today; today.temp=25.5; today.wind=4; printf(”Temp=%f\n”,today.temp); printf(”Wind=%d\n”,today.wind); }
struct 结构类型 函数名(形式参数表 )
参数说明
{ 函数体
}
例如:下面程序说明结构型函数的定义和使用方法。
#include <stdio.h> struct person
{
char name[20]; unsigned long id; float salary; struct person temp; printf(”Please enter a name for one person:\n”); scanf(”%s”,temp.name); printf(”Please enter one‟s ID number and his salary:\n”); scanf(”%ul%f\n”,temp.id,temp.salary); return temp; /* 返回结构变量temp */
相关文档
最新文档