转载请注明来源: http://blog.csdn.net/kjunchen/article/details/53162979
C 结构体与共用体的用法
struct(结构体)
C 语言允许用户建立有不同类型数据组成的组合型的数据结构,它成为结构体(structure)。
建立自己的结构体
结构体的声明
struct 结构体名
{成员列表};结构体类型的名字是由一个关键字 struct 和结构体名组合而成的。结构体名是由用户指定,又称“结构体标记”(strcuture)。
各成员都应进行类型声明,即:
类型名 成员名
成员列表也成为域表,每一个成员是结构体中的一个域。成员名命名规则与变量名相同。
struct Date { //声明一个结构体类型 struct Date
int month;
int day;
int year;
};
struct Student { //声明一个结构体类型 struct Student
char name[20];
char sex;
int age;
struct Date birthday; //成员 birthday 属于 struct Date 类型
};
Tips: 习惯于将结构体名、共用体名和枚举名的第 1 个字母用大写表示,以表示和系统提供的类型名相区别。
定义结构体类型变量
- 先声明结构体类型,在定义该类型的变量。
struct Student student1, student2;
定义了两个 Student 结构体类型的变量 student1 和 student2。
- 在声明类型的时候同时定义变量
struct Student {
char name[20];
int age;
char sex;
} student1, student2;
一般形式:
struct 结构体名 {
成员表列;
} 变量名表列;
- 不指定类型名而直接定义结构体类型变量
一般形式:
struct {
成员表列;
} 变量名表列;
说明:(1)、只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型不分配空间,只对变量分配空间。(2)、结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同意对象。
结构体变量的初始化和引用
(1)在定义结构体变量时可以对它的成员初始化。初始化列表用花括号括起来,依次赋给结构体变量各成员。
C99 标准允许对某一成员初始化,如:
struct Student a = {.name = "Zhang San"};
“.name” 隐含代表结构体变量 a 中的成员 a.name 。其他未被指定初始化的数值型成员被系统化为 0 ;字符型初始化为 ‘\0’,指针型初始化为 NULL。
(2)结构体变量中的成员值引用方式为:
结构体变量名.成员名
如a.name 表示引用 a 变量的 name 成员值; “.” 是成员运算符,它在所有的运算符中优先级最高。
(3)如果成员本身又是一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员,只能对最低一级的成员进行赋值或存取以及运算。
student.birthday.month (结构体变量 student 中的成员 birthday 中的成员 month)
(4)对结构体成员变量可以向普通变量一样进行各种运算。
student.age++ (自加运算)
(5)同类结构体变量可以相互赋值。
student1 = student2;
(6)使用 scanf 函数输入结构体变量时,必须分别输入各成员的值,不能再 scanf 函数中使用结构体变量名一揽子输入全部成员的值。
scanf("%d%s%c", &student.num, student.name, &student.sex);
注意 student.name 前没有 & 运算符,因为 name 是数组名,本身就代表地址。
Example:
#include <stdio.h>
int main() {
struct Student {
int num;
char name[20];
int age;
cha