程序员Feri一名12年+的程序员,做过开发带过团队创过业,擅长Java、鸿蒙、嵌入式、人工智能等开发,专注于程序员成长的那点儿事,希望在成长的路上有你相伴!君志所向,一往无前!
结构体嵌套
结构体的成员也是变量,那么成员可以是基本数据类型
,也可以是数组
、指针
、结构体
等类型 。如果结构体的成员是另一个结构体,这就构成了结构体嵌套。
#include <stdio.h>
#include <string.h>
struct Name {
char firstName[50];
char lastName[50];
};
struct Student {
int age;
struct Name name;
char gender;
} stu1;
int main(){
strcpy(stu1.name.firstName, "美美");
strcpy(stu1.name.lastName, "韩");
//stu1.age = 18;
//stu1.gender = 'F';
//或者
struct Name myname = {"美美","韩"};
stu1.name = myname;
//stu1.age = 18;
//stu1.gender = 'F';
return 0;
}
声明结构体变量并调用成员:
#include <stdio.h>
#include <string.h>
int main(){
struct Employee emp1;
emp1.id = 1001;
strcpy(emp1.name,"Tony");
emp1.age = 24;
emp1.birthday.year = 2001;
emp1.birthday.month = 3;
emp1.birthday.day = 12;
return 0;
}
说明:如果成员本身又属一个结构体类型,则要用若干个点( . ),一级一级地找到最低的一级的成员。比如,emp1.birthday.year
。
结构体占用空间
结构体占用的存储空间,不是各个属性存储空间的总和。
为了计算效率,C 语言的内存占用空间一般来说,都必须是 int 类型存储空间的整数倍。
如果 int 类型的存储是4字节,那么 struct 类型的存储空间就总是4的倍数。
struct A{
char a;
int b;
} s;
int main() {
printf("%d\n", sizeof(s)); // 8
return 0;
}
变量 s 的存储空间不是5个字节,而是占据8个字节。a 属性与 b 属性之间有3个字节的“空洞”。
结构体变量的赋值操作
同类型的结构体变量可以使用赋值运算符( = ),赋值给另一个变量,比如
student1 = student2; //假设student1和student2已定义为同类型的结构体变量
这时会生成一个全新的副本
。系统会分配一块新的内存空间,大小与原来的变量相同,把每个属性都复制过去,即原样生成了一份数据。
也就是说,结构体变量的传递机制是值传递,而非地址传递。这一点跟数组的赋值不同,使用赋值运算符复制数组,不会复制数据,只是传递地址。
举例:
struct Car {
double price;
char name[30];
} a = {.name = "Audi A6L", .price = 390000.99};
int main() {
struct Car b = a;
printf("%p\n", &a); //结构体a变量的地址 00007ff75a019020
printf("%p\n", &b); //结构体b变量的地址 000000a6201ffcd0
printf("%p\n", a.name); //结构体a变量的成员name的地址 00007ff719199028
printf("%p\n", b.name); //结构体b变量的成员name的地址 000000c2565ffd88
a.name[0] = 'B';
printf("%s\n", a.name); // Budi A6L
printf("%s\n", b.name); // Audi A6L
return 0;
}
上例中,变量 b 是变量 a 的副本,两个变量的值是各自独立的,修改掉 b.name 不影响 a.name 。
结构体数组
结构体数组:数组元素是结构体变量而构成的数组。先定义结构体类型,然后用结构体类型定义数组变量。
方式1:先声明一个结构体类型,再用此类型定义结构体数组
结构体类型 数组名[数组长度];
举例:
struct Person{
char name[20];
int age;
};
struct Person pers[3]; //pers是结构体数组名
struct Student stus[3] = { {1001,"Tom",'M', 14},
{1002, "Jerry", 'M', 13},
{1003, "Lily",'F',12}};
结构体数组元素的成员的调用
使用数组角标方式**
结构体数组名[下标].成员名
如:
stus[1].age = 23;
着急去开年会,就到这里啦,提前祝我抽个大奖!