- struct 结构体
struct Student{ //声明结构体
char name[20]; //姓名
int num; //学号
float score; //成绩
};
要定义结构变量,则一般形式是:
struct 结构体名 结构体变量名;
如:
struct Student stu1; //定义结构体变量
1)、结构体变量的定义可以放在结构体的声明之后:
struct Student{ //声明结构体
char name[20]; //姓名
int num; //学号
float score; //成绩
};
struct Student stu1; //定义结构体变量
2)、结构体变量的定义也可以与结构体的声明同时,这样就简化了代码:
struct Student{
char name[20];
int num;
float score;
}stu1; //在定义之后跟变量名
3)、还可以使用匿名结构体来定义结构体变量:
struct { //没有结构名
char name[20];
int num;
float score;
}stu1;
2.访问结构体成员
struct Birthday{ //声明结构体 Birthday
int year;
int month;
int day;
};
struct Student{ //声明结构体 Student
char name[20];
int num;
float score;
struct Birthday birthday; //生日
}stu1;
则用 stu1.birthday.year 访问出生的年份。
1)、结构体变量的初始化可以放在定义之后:
可以对结构体的成员逐个赋值:
struct Student stu1, stu2; //定义结构体变量
strcpy(stu1.name, “Jack”);
stu1.num = 18;
stu1.score = 90.5;
注意:不能直接给数组名赋值,因为数组名是一个常量。如:
stu1.name = “Jack”; //…main.c:26:15: Array type ‘char [20]’ is not assignable
或者可以对结构体进行整体赋值:
stu2 = (struct Student){
“Tom”, 15, 88.0};
2)、结构体变量的初始化也可以与定义同时:
struct Student{ //声明结构体 Student
char name[20];
int num;
float score;
}stu = {
“Mike”, 15, 91}; //注意初始化值的类型和顺序要与结构体声明时成员的类型和顺序一致
此时不需要强制类型转换
也可以部分初始化:
struct Student stu4 = {.name = “Lisa”};
?1
也可以按照任意的顺序使用指定初始化项目:
struct Student st = { .name = “Smith”,
.score = 90.5,
.num = 18 };
3)、可以用一个已经存在的结构体去初始化一个新的相同类型的结构体变量,是整体的拷贝(每一个成员都一一赋值给新的结构体变量),而不是地址赋值。如:
stu3 = stu1;
printf(“stu1 addr: %p\nstu3 addr: %p\n”, &stu1, &stu3);
printf(“stu1.num: %d\nstu3.num: %d\n”, stu1.num, stu3.num);
printf(“stu1.num addr: %p\nstu3.num addr: %p\n”, &stu1.num, &stu3.num);
//输出结果:
stu1 addr: 0x10000104c
stu3 addr: 0x100001084
stu1.num: 18
stu3.num: 18
stu1.num addr: 0x100001060
stu3.num addr: 0x100001098
- typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
- strcpy C 库函数?char *strcpy(char *dest, const char *src)?把?src?所指向的字符串复制到?dest。