数组:只能由多个相同类型的数据构成
结构体:可以由多个不同类型的数据构成
1.定义结构体类型
struct Person
{ // 里面的3个变量,可以称为是结构体的成员或者属性
int age; // 年龄
double height; // 身高
char *name; // 姓名
};
2.根据结构体类型,定义结构体变量
struct Person p = {20, 1.55, "jack"};
/* 错误写法
struct Person p2;
p2 = {30, 1.67, "jake"};
*/结构体要在定义的时候初始化
注意: 1.定义结构体类型(并不会分配存储空间)
2.定义结构体变量(真正分配存储空间)
/ 补齐算法(对齐算法)
// 结构体所占用的存储空间 必须是 最大成员字节数的倍数
注意,如果定义了两个结构体变量,下面的操作 会将d1所有成员的值对应地赋值给d2的所有成员
d2 = d1;
d2.year = 2010; // 改变第二个结构体的成员变量并不会影响第一个的
1.定义结构体变量的3种方式
1> 先定义类型,再定义变量(分开定义)
struct Student
{
int age;
};
struct Student stu;
2> 定义类型的同时定义变量
struct Student
{
int age;
} stu;
struct Student stu2;
3> 定义类型的同时定义变量(省略了类型名称)
struct
{
int age;
} stu;
2.结构体类型的作用域
1> 定义在函数外面:全局有效(从定义类型的那行开始,一直到文件结尾)
2> 定义在函数(代码块)内部:局部有效(从定义类型的那行开始,一直到代码块结束)
*结构体类型不能重复定义
结构体数组:
1.定义跟结构体变量一样,结构体数组也有3种定义方式
1.
struct Student {
char *name;
int age;
<pre name="code" class="objc" style="font-size: 11.8181819915771px;">};
struct Student stu[5];//定义1
2.
struct Student {
char*name;
<span style="font-size: 11.8181819915771px; font-family: Arial, Helvetica, sans-serif;">int age;</span>
} stu[5];//定义2
3.
struct{
char*name;
<span style="font-size: 11.8181819915771px;"> </span><span style="font-size: 11.8181819915771px; font-family: Arial, Helvetica, sans-serif;">int </span><span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">age;</span><pre name="code" class="objc" style="font-size: 11.8181819915771px;"><span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">} stu[5]; / / 定义3</span>
上面3种方式,都是定义了一个变量名为stu的结构体数组,数组元素个数是5
2.初始化
struct{
char * name;
int age;} stu[2] = { {"MJ",27}, {"JJ",30}};
也可以用数组下标访问每一个结构体元素,跟普通数组的用法是一样的 。
指向结构体的指针
1.指向结构体的指针的定义
struct Student *p;
2.利用指针访问结构体的成员
1> (*p).成员名称
2> p->成员名称
// 结构体变量
struct Student stu = {1, 20};
// 指针变量p将来指向struct Student类型的数据
struct Student *p;
// 指针变量p指向了stu变量
p = &stu;
p->age = 30;
// 第一种方式
printf("age=%d, no=%d\n", stu.age, stu.no);
// 第二种方式
printf("age=%d, no=%d\n", (*p).age, (*p).no);
// 第三种方式
printf("age=%d, no=%d\n", p->age, p->no);
结构体和函数:
如果结构体作为函数参数,只是将实参结构体所有成员的值对应地赋值给了形参结构体的所有成员
修改函数内部结构体的成员不会影响外面的实参结构体
结构体的嵌套定义:
// 类型
struct Student
{
int no; // 学号
struct Date birthday; // 生日
struct Date ruxueDate; // 入学日期
// 这种写法是错误的
//struct Student stu;
};