struct 结构体名{ // 结构体名首字母大写
成员变量列表; // 成员变量可以是基本数据类型、指针或者结构体等
}
访问成员变量的方式:① “ . ”:直接对结构体成员变量进行访问;② “ -> ”:通过存放结构体变量的指针(结构体的地址)来访问结构体的成员变量。
定义结构体和结构体变量的三种方式:
(1)先定义结构体,在使用时再定义结构体变量
#include
// 自定义一个结构体 Person,是一个自定义的数据类型
struct Person{
char *name;
int age;
};
int main(){
// 定义 结构体数据类型Person 的 结构体变量
struct Person person1; // 先定义结构体变量,之后进行赋值
struct Person person2 = {"Jack", 20}; // 在定义变量的同时进行赋值
struct Person *person3; // 通过指针来访问结构体的成员变量, 不能在定义变量的同时进行赋值
struct Person *person4 = &person2; // 通过存放结构体变量的指针(结构体的地址)来访问结构体的成员变量,person4指向了person2的地址
person1.name = "Tom"; // 直接对结构体成员变量进行访问
person1.age = 23;
person3->name = "Tom"; // 通过指针来访问结构体的成员变量
person3->age = 23;
printf("person1: name = %s, age = %d \n", person1.name, person1.age); // person1: name = Tom, age = 23
printf("person2: name = %s, age = %d \n", person2.name, person2.age); // person2: name = Jack, age = 20
printf("person3: name = %s, age = %d \n", person3->name, person3->age); // person3: name = Tom, age = 23
person4->name = "Tom"; // 通过指针来访问结构体的成员变量,相当于修改了person2
person4->age = 23;
printf("person2: name = %s, age = %d \n", person2.name, person2.age); // person2: name = Tom, age = 23
printf("person4: name = %s, age = %d \n", person4->name, person4->age); // person4: name = Tom, age = 23
(*person4).name = "Jack"; // 通过指针来访问结构体的成员变量,相当于修改了person2
(*person4).age = 20;
printf("person2: name = %s, age = %d \n", person2.name, person2.age); // person2: name = Jack, age = 20
printf("person4: name = %s, age = %d \n", person4->name, person4->age); // person4: name = Jack, age = 20
return 0;
}
(2) 在定义结构体的同时定义结构体变量
#include
struct Person{
char *name;
int age;
}person1, person2 = {"Jack", 20}, *person4 = &person2; // 在这里不能直接定义指针变量 *person3
int main(){
person1.name = "Tom";
person1.age = 23;
printf("person1: name = %s, age = %d \n", person1.name, person1.age); // person1: name = Tom, age = 23
printf("person2: name = %s, age = %d \n", person2.name, person2.age); // person2: name = Jack, age = 20
person4->name = "Tom";
person4->age = 23;
printf("person2: name = %s, age = %d \n", person2.name, person2.age); // person2: name = Tom, age = 23
printf("person4: name = %s, age = %d \n", person4->name, person4->age); // person4: name = Tom, age = 23
(*person4).name = "Jack";
(*person4).age = 20;
printf("person2: name = %s, age = %d \n", person2.name, person2.age); // person2: name = Jack, age = 20
printf("person4: name = %s, age = %d \n", person4->name, person4->age); // person4: name = Jack, age = 20
return 0;
}
(3) 如果只需要 person1、person2 两个变量,后面不需要再使用结构体时,在定义结构体时也可以不给出结构体名。
#include
struct{
char *name;
int age;
}person1, person2 = {"Jack", 20}, *person4 = &person2; // 在这里不能直接定义指针变量 *person3
int main(){
person1.name = "Tom";
person1.age = 23;
printf("person1: name = %s, age = %d \n", person1.name, person1.age); // person1: name = Tom, age = 23
printf("person2: name = %s, age = %d \n", person2.name, person2.age); // person2: name = Jack, age = 20
person4->name = "Tom";
person4->age = 23;
printf("person2: name = %s, age = %d \n", person2.name, person2.age); // person2: name = Tom, age = 23
printf("person4: name = %s, age = %d \n", person4->name, person4->age); // person4: name = Tom, age = 23
(*person4).name = "Jack";
(*person4).age = 20;
printf("person2: name = %s, age = %d \n", person2.name, person2.age); // person2: name = Jack, age = 20
printf("person4: name = %s, age = %d \n", person4->name, person4->age); // person4: name = Jack, age = 20
return 0;
}
union 共用体名{ // 结构体名首字母大写
成员变量列表; // 成员变量可以是基本数据类型、指针或者结构体等
}
结构体和共用体的区别:结构体的各个成员变量会占用不同的内存,互相之间没有影响;而共用体的所有成员变量占用同一段内存,修改一个成员变量会影响其余所有成员变量。
#include
union Data{ // 共用体的成员共享内存空间,该空间的大小以占用最大的成员(int)为准
int a;
short b;
};
int main(){
union Data data;
printf("内存大小: %d \n", sizeof(data)); // 内存大小: 4
data.a = 2;
printf("a = %d, b = %d \n", data.a, data.b); // a = 2, b = 2
data.b = 3;
printf("a = %d, b = %d \n", data.a, data.b); // a = 3, b = 3
return 0;
}