结构体:将不同数据类型组合成一个新的数据类型;
#include <stdio.h>
struct Person
{
char name[50];
int age;
bool gender;
};
int main()
{
}
定义了一个结构体Person,它包含一个字符数组成员name,int类型的age和bool类型的gender;
struct 结构体名称
{
结构体成员;
}
结构体成员可以是任何一种基础数据类型,也可以是其他结构体;结构体名首字符大写;
结构体可以放在函数内,也可以放在函数外,放在函数内只能在函数内使用,放在函数外所有的函数都可以使用它。
#include <stdio.h>
struct Person
{
char name[50];
int age;
bool gender;
};
int main()
{
struct Person p1;
}
结构体也是一种数据类型,使用它的时候必须定义一个真正的结构体变量;不然它不会在内存中分配空间存储数据;
结构体声明: struct Person p1; 这里的struct不能省掉;
#include <stdio.h>
struct Person
{
char name[50];
int age;
bool gender;
}p1;
int main()
{
}
也可以在结构体声明的时候定义结构体变量;但是这个时候p1是一个全局变量,在任何函数中都可以对它进行访问;
结构体中字符串不能直接这样赋值;编译器会报错;
#include <stdio.h>
#include <string.h>
struct Person
{
char name[50];
int age;
bool gender;
};
int main()
{
struct Person p1;
strcpy_s(p1.name, "张三"); //不能这样赋值p1.name = "张三";
p1.age = 18;
p1.gender = true;
}
对字符串赋值需要引入 string.h 头文件,使用 strcpy_s 函数;
#include <stdio.h>
#include <string.h>
struct Person
{
char name[50];
int age;
bool gender;
};
int main()
{
struct Person p1;
strcpy_s(p1.name, "张三"); //不能这样赋值p1.name = "张三";
p1.age = 18;
p1.gender = true;
printf("姓名:%s\n", p1.name);
printf("年龄:%d\n", p1.age);
if (p1.gender)
{
printf("性别:男性\n");
}
else
{
printf("性别:女性\n");
}
}
访问结构体成员时,通过定义的结构体变量 加 点号,访问其中结构体的成员;
#include <stdio.h>
#include <string.h>
struct Person
{
char name[50];
int age;
bool gender;
};
int main()
{
struct Person p1 {
"李四",
16,
false
};
printf("姓名:%s\n", p1.name);
printf("年龄:%d\n", p1.age);
if (p1.gender)
{
printf("性别:男性\n");
}
else
{
printf("性别:女性\n");
}
}
结构体的初始化,用逗号分隔每个初始化的值,这样写时要和定义时的成员一一对应;
如果没有对成员进行初始化,那么会根据数据类型将会自动初始化;字符串的初始值为‘\0’。
#include <stdio.h>
#include <string.h>
struct Birthday
{
int year;
int month;
int day;
};
struct Person
{
char name[10];
int age;
bool gender;
Birthday birthday;
};
int main()
{
struct Person p1;
strcpy_s(p1.name, "王五");
p1.age = 16;
p1.gender = true;
p1.birthday.year = 2006;
p1.birthday.month = 12;
p1.birthday.day = 6;
printf("姓名:%s,年龄:%d,性别:%s,生日:%d-%d-%d\n", p1.name, p1.age, p1.gender == true ? "男性" : "女性", \
p1.birthday.year, p1.birthday.month, p1.birthday.day);
}
结构体嵌套,一个结构体中包含另外一个结构体;访问的时候需要使用
结构体变量名 (.)点号 结构体变量名 (.)点号 结构体成员,如果多层嵌套就需要一级一级的向下找。
int main()
{
struct Person p1[10];
strcpy_s(p1[0].name, "王五");
p1[0].age = 16;
p1[0].gender = true;
p1[0].birthday.year = 2006;
p1[0].birthday.month = 12;
p1[0].birthday.day = 6;
printf("姓名:%s,年龄:%d,性别:%s,生日:%d-%d-%d\n", p1[0].name, p1[0].age, p1[0].gender == true ? "男性" : "女性", \
p1[0].birthday.year, p1[0].birthday.month, p1[0].birthday.day);
}
结构体数组,当需要定义多个人的数据的时候,就可以定义成结构体数组,和普通数组一样的使用方式;
int main()
{
struct Person p1[10];
struct Person* ptr;
ptr = &p1[0];
strcpy_s(p1[0].name, "王五");
p1[0].age = 16;
p1[0].gender = true;
p1[0].birthday.year = 2006;
p1[0].birthday.month = 12;
p1[0].birthday.day = 6;
printf("姓名:%s,年龄:%d,性别:%s,生日:%d-%d-%d\n", (* ptr).name, (*ptr).age, (*ptr).gender == true ? "男性" : "女性", \
p1[0].birthday.year, p1[0].birthday.month, p1[0].birthday.day);
}
结构体指针,将结构体的地址赋值给结构体指针,通过(*结构体指针变量名) (.)点号 成员 的方式进行访问;因为 (.)点号 的优先级比 (*)型号 高,所以要用(*结构体指针变量名)进行解引用,让它变成结构体变量,在用 点号 访问其成员;
printf("姓名:%s,年龄:%d,性别:%s,生日:%d-%d-%d\n", ptr->name, ptr->age, ptr->gender == true ? "男性" : "女性", \
p1[0].birthday.year, p1[0].birthday.month, p1[0].birthday.day);
还可以通过 (->)箭头的方式访问结构体成员,这种方式只能用于结构体指针;