结构体,结构体数组,结构体指针
············目标········
·掌握结构体类型的定义
·掌握结构体变量的定义及初始化
·掌握结构体变量的操作
·掌握结构体数组的使用
·结构体指针的定义及使用
·
1.结构体类型的定义
语法:定义结构体类型的一般形式如下
struct 结构体类型名
{
数据类型1 成员1 ;
数据类型2 成员2 ;
数据类型n 成员n ;
} ;
语义:定义一个含有n个成员的结构体类型。注意编译器不为类型分配存储空间
例:定义结构体类型DateType表示年、月、日等信息。
struct DateType
{
int year ;
int month ;
int day ;
};
结构体类型可以嵌套定义,例如 :
struct StudentType
{
char name[20];
char gender[3];
struct DateType birthday ; //struct DateType是已定义的类型
};
2.结构体变量的定义
语法:定义结构体变量的一般形式如下:
(1)先定义结构体类型,再定义结构体变量
struct 结构类型名 变量名列表 ;
(2)在定义结构体类型的同时定义结构体变量
struct 结构类型名
{
成员列表
} 变量名列表 ;
语义:定义变量名列表中的变量为结构体类型,编译器为结构体变量分配存储空间。
struct DateType //先定义结构体类型
{
int year, month, day;
};
struct DateType birthday; //再定义结构体变量birthday
struct DateType
{
int year, month, day;
} birthday; //在定义结构体类型的同时定义结构体变量birthday
3.结构体变量的引用
语法:引用结构体变量的一般形式如下:
结构变量名. 成员名
·结构体变量的初始化
(1)先定义结构体类型,再定义结构体变量并赋初值
struct 结构体类型名 变量名 = {成员1的初值,……,成员n的初值} ;
(2)在定义结构体类型的同时定义结构体变量并赋初值
struct 结构体类型名
{
声明成员类型
} 变量名 = {成员1的初值,……,成员n的初值} ;
语义:定义结构体变量并初始化。
例:struct DateType
{
int year;
int month;
int day;
};
struct DateType birthday = {1968, 3, 26};
struct DateType
{
int year;
int month;
int day;
} birthday = {1968, 3, 26};
·结构体变量的操作
1. 输入/输出操作
在C语言中,结构体变量不能作为scanf函数和printf函数的实参,换言之,不能整体读入一个结构体变量,也不能整体输出一个结构体变量,只能对结构体变量的各个成员进行输入/输出操作。
struct DateType birthday;
scanf ("%d%d%d", &birthday.year, &birthday.month, &birthday.day );
printf("%d-%d-%d", birthday.year, birthday.month, birthday.day );
2. 赋值操作:
在程序中为其各个成员逐一赋值,但不能整体赋值。
struct DateType birthday;
birthday = {1997, 1, 4};
这是错误的!
正确的应该是:
struct DateType birthday1 = {1997, 1, 4}, birthday2;
birthday2 = birthday1;
如果两个结构体变量的类型相同,程序中可以进行整体赋值。
3. 其他操作:
C语言没有定义施加于结构体类型上的运算,对结构体变量的操作是通过对其成员的操作实现的。
本质上,结构体变量的成员是一个简单变量,因此,其成员的使用方法与同类型简单变量的使用方法相同。
struct DateType birthday1 = {1968, 3, 26}, birthday2;
int year;
birthday2.year = 1963;
year = birthday1.year - birthday2.year; //两个结构体变量相差的年数
·结构体数组
1·结构体数组变量的定义
struct StudentType
{
char no[10] ;
char name[10] ;
double foreign ;
double spec1 ;
double spec2 ;
} ;
struct StudentType stud[10] ;
(1)结构体数组的引用
语法:引用结构体数组的一般形式如下:
结构体数组名[下标].成员名
语义:引用结构体数组的具体成员。
(2)结构体数组变量的初始化
struct StudentType
{
char no[10];
char name[10];
double foreign;
double spec1;
double spec2;
} stud[10] ={{001, 陆宇, 87, 67, 88}, {002, 李明, 68, 85, 78}};
struct StudentType stud[10] ={{001, 陆宇, 87, 67, 88}, {002, 李明, 68, 85, 78}};
2·结构体数组元素的操作
由于结构体数组的每个元素都是一个结构体类型的数据,因此结构体数组元素的使用方法与结构体变量的使用方法相同,结构体数组元素每个成员的使用方法与同类型简单变量的使用方法相同。
struct StudentType stu[5] ={{0001, 陆宇, 87, 67, 88}};
stu[1] = stu[0]; /*结构体数组元素之间可以直接赋值*/
stu[2].foreign = 98;
strcpy(stu[2].name, "王奇");
printf("外语成绩的差是%6.2f\n", stu[2].foreign - stu[1].foreign);
·结构体指针的定义及使用
其中,结构体类型是一个已定义或正在定义的结构体类型;指针变量名是一个合法的标识符。
语义:定义一个指针指向结构体类型。
定义一个结构体指针后,需要将该指针与一个结构体变量的地址绑定,例如,如下语句声明并初始化了一个指向结构体的指针p。
struct DateType
{
int year, month, day;
};
struct DateType birthday = {1968, 3, 26};
struct DateType *p = &birthday;
通过指针访问结构体成员
A.(*指针).成员
其中,“*指针”一定要用括号括起来,因为成员运算符“.”的优先级高于间接引用运算符“*”的优先级。
B.指针->成员
语义:通过结构体指针引用结构体变量的某个具体成员。
例:struct DateType
{
int year, month, day;
};
struct DateType birthday = {1968, 3, 26};
struct DateType *p = &birthday;
printf("%4d-%2d-%2d\n", p->year, p->month, p->day);
注意:结构体指针作为函数参数
将结构体变量传递给函数,可有三种方法:
形参是结构体成员,实参是对应结构体成员的值,参数传递是将结构体成员的值传递给形参。
形参是结构体变量,实参是结构体变量的值,参数传递是将结构体变量的值传递给形参。
形参是指向结构体类型的指针,实参是结构体变量的地址或指向结构体变量的指针,参数传递是将结构体变量的首地址传递给形参。
前两种方法属于值传递方式,结构体规模较大时,空间和时间的开销很大,一般较少使用。
/*大学一路C*/