- 数组:职能由多个相同类型的数据构成
- 结构体:可以由多个不同类型的数据构成
struct Person根据结构体类型,定义结构体变量且赋值:struct结构体类型名 变量名={};
{ // 里面的3个变量,可以称为是结构体的成员或者属性
int age; // 年龄
double height; // 身高
char *name; // 姓名
};
struct Person p = {20, 1.55, "jack"};
修改成员变量值:
p.age = 30;printf成员变量值的方法:
p.name = "rose";
printf("age=%d, name=%s, height=%f\n", p.age, p.name, p.height);无序的赋值方法:
struct Person p2 = {.height = 1.78, .name="jim", .age=30};
二.结构体的内存分析
- 结构体所占用的存储空间,必须是最大成员字节的倍数。
- 定义结构体类型并不会分配存储空间。
- 定义结构体变量分配存储空间。
struct Date
{
int year;
int month;
int day;
};
struct Date d1 = {2011, 4, 10};
struct Date d2 = {2012, 8, 9};
d2 = d1;
d2.year = 2010;
三.结构体注意点 定义结构体变量的3种方式 先定义类型,再定义变量
struct Student
{
int age;
};
struct Student stu;
定义类型的同时定义变量
struct Student
{
int age;
} stu;
struct Student stu2;
定义类型的同时定义变量(省略了类型名称)
struct
{
int age;
} stu;
结构体类型的作用域:
- 定义在函数外面:全局有效(从定义类型的那行开始,一直到文件结尾)
- 定义在函数(代码块)内部:局部有效(从定义类型的那行开始,一直到代码块结束)
int main()
{
struct RankRecord
{
int no; // 序号 4
int score; // 积分 4
char *name; // 名称 8
};
struct RankRecord records[3] =
{
{1, "ptt", 5000},
{2, "pdd", 500},
{3, "pet",300}
};
records[0].no = 4;
// 错误写法
//records[0] = {4, "rose", 9000};
for (int i = 0; i<3; i++)
{
printf("%d\t%s\t%d\n", records[i].no, records[i].name, records[i].score);
}
//printf("%d\n", sizeof(records));
return 0;
}
指向结构体的指针
1.指向结构体指针的定义:struct 结构体类型*变量名;
2.利用指针访问结构体的成员
- (*变量名).成员名称
- 变量名->成员名称
#include <stdio.h>
int main()
{
struct Student
{
int no;
int age;
};
// 结构体变量
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);
return 0;
}
如果结构体作为函数参数,只是将实参结构体所有成员的值对应的福祉给了形参结构体的所有成员
修改函数内部结构体的成员不会影响外面的实参结构体,指针作为函数参数则可以改变
#include <stdio.h>
struct Student
{
int age;
int no;
};
void test(struct Student s)
{
s.age = 30;
s.no = 2;
}
// 会影响外面的实参结构体
void test2(struct Student *p)
{
p->age = 15;
p->no = 2;
}
void test3(struct Student *p)
{
struct Student stu2 = {15, 2};
p = &stu2;
p->age = 16;
p->no = 3;
}
int main()
{
struct Student stu = {28, 1};
//test(stu);
//test2(&stu);
test3(&stu);
printf("age=%d, no=%d\n", stu.age, stu.no);
return 0;
}
结构体嵌套:结构体可以拥有另一个结构体类型的成员变量。
#include <stdio.h>枚举:当变量只允许有几个固定的取值的时候用枚举,枚举用来同事间的交流。
int main()
{
struct Date
{
int year;
int month;
int day;
};
// 类型
struct Student
{
int no; // 学号
struct Date birthday; // 生日
struct Date ruxueDate; // 入学日期
// 这种写法是错误的
//struct Student stu;
};
struct Student stu = {1, {2000, 9, 10}, {2012, 9, 10}};
printf("year=%d,month=%d,day=%d\n", stu.birthday.year, stu.birthday.month, stu.birthday.day)
return 0;
}
定义:enum 枚举类型名 {};
#include <stdio.h>
int main()
{
enum Sex { Man, Woman, Unkown};
// 0男 1女 -1不详
//int sex = 3;
//enum Sex s = Unkown;
// 1.定义枚举类型
enum Season
{
spring = 1,
summer,
autumn,
winter
};
// 2.定义枚举变量
enum Season s = summer;
return 0;
}