C语言 第六章 结构体(2)
目录
结构体嵌套
举例1:
举例2:
举例3:自我嵌套
结构体变量的赋值操作
例子:
结构体嵌套
结构体的成员也是变量,那么成员可以是基本数据类型,也可以是数组、指针、结构体等类型。如果结构体的成员是另一个结构体,这就构成了结构体嵌套。
举例1:
#include <stdio.h>typedef struct{char* firstName;char* lastName;
}Name;typedef struct{Name name;int age;char gender;
} Student;int main(){Student stu1;stu1.name.firstName = "美美";stu1.name.lastName = "韩";stu1.age = 18;stu1.gender = 'F';//或者Name name = {"美美","韩"};stu1.name = name;stu1.age = 18;stu1.gender = 'F';return 0;
}
举例2:
typedef struct { //声明一个结构体类型 struct Dateint year; //年int month; //月int day; //日
}Date;typedef struct { //声明一个结构体类型 struct Employeeint id;char* name;int age;Date birthday; //成员birthday属于struct Date类型
}Employee;
声明结构体变量并调用成员:
#include <stdio.h>int main(){Employee empl;empl.id = 1001;empl.name = "Tony";empl.age = 24;empl.birthday.year = 2001;empl.birthday.month = 3;empl.birthday.day = 12;return 0;}
说明:如果成员本身又属一个结构体类型,则要用若干个 .,一级一级地找到最低的一级的成员。比如,emp1.birthday.year。
赋值的时候还有多种写法:
#include <stdio.h>
int main() {
//方式1:
Employee emp1 = {1001, "Tony", 24, {1999, 10, 11}};
//方式2:
Date birthday = {2001, 5, 6};
//方式3:
Employee emp3 = {
.id = 1003,
.age = 24,
.name = "Jerry",
.birthday = {2001, 3, 16}
};
//方式4:
Employee emp4 = {
.id = 1003,
.age = 27,
.name = "Jerry",
.birthday.year = 1998,
.birthday.month = 8,
.birthday.day = 12
};
return 0;
}
举例3:自我嵌套
单链表结构的结点定义如下:
struct Node {
int data; //这里默认的是int型,如需其他类型可修改
struct Node* next; //指向Node型变量的指针
};
结构体变量的赋值操作
同类型的结构体变量可以使用赋值运算符(=),赋值给另一个变量,比如
student1 = student2; // 假设student1和student2定义为同类型的结构体变量
这时会生成一个新的副本。系统会分配一块新的内存空间,大小与原来的变量相同,把每个属性都复制过去,即原样生成了一份数据。
也就是说,结构体变量的传递机制是值传递,而非地址传递。这一点跟数组的赋值不同,使用赋值运算符给数组赋值,不会复制数据,只是传递地址。
例子:
struct Car {
double price;
char* name;
} a = {.name = "AudiA6", .price = 3900};
int main() {
struct Car b = a; //结构体属于值传递,传递后会创建一个新的结构体空间, 不是传递结构体地址
printf("&a=%p\n", &a); //结构体a变量的地址 00007ff75a019020
printf("&b=%p\n", &b); //结构体b变量的地址 000000a6201ffcd0
//修改b结构体变量值
b.name = "宝马";
b.price = 40000;
printf("a.name=%s,a.price=%.2lf\n",a.name,a.price); //a.name=AudiA6,a.price=3900.00
printf("b.name=%s,b.price=%.2lf\n",b.name,b.price); //b.name=宝马,b.price=40000.00
}
注:上例中,变量b是变量a的副本,两个变量的值是各自独立的,修改掉b.name不影响a.name.