多个相同类型的数据构成的集合叫做数组,多个不同类型的数据构成的集合叫做结构体。
结构体类型的作用域:
① 定义在函数外面:全局有效(从定义类型的那行开始,一直到文件结尾)
② 定义在函数(代码块)内部:局部有效(从定义类型的那行开始,一直到代码块结束)
1、结构体的定义
struct是关键字,是结构体类型的标志
1 struct 结构体名{ 2 3 类型名1 成员名1; 4 5 类型名2 成员名2; 6 7 …… 8 9 类型名n 成员名n; 10 11 };
2、结构体变量的定义
① 先定义结构体类型,再定义结构体变量
1 struct Student { 2 char *name; 3 int age; 4 }; 5 6 struct Student stu;
② 定义结构体的同时定义变量
1 struct Student { 2 char *name; 3 int age; 4 } stu;
③ 定义结构体变量,省略类型名
1 struct { 2 char *name; 3 int age; 4 } stu;
2、注意事项
① 结构体内可以包含别的结构体
1 struct Date { 2 int year; 3 int month; 4 int day; 5 }; 6 7 struct Student { 8 char *name; 9 struct Date birthday; 10 };
② 只有定义属于结构体类型的变量时,系统才会分配存储空间给变量
1 struct Student { 2 char *name; 3 int age; 4 }; 5 6 struct Student stu;
③ 结构体变量占用的内存空间是其成员所占内存之和
3、结构体的初始化
对各成员初始化,一一对应赋值
1 struct Student { 2 char *name; 3 int age; 4 }; 5 6 struct Student stu = {"gaizuojia", 22};
4、 结构体的使用
① 对结构体变量的操作是以成员为单位进行,格式:结构体变量名.成员名
1 // 访问stu的age成员 2 stu.age = 22;
② 相同类型的结构体变量之间可以进行整体赋值
1 // 将stu1直接赋值给stu2 2 struct Student stu2 = stu1;
5、结构体数组
结构体数组的定义和普通结构体类似。
1 //结构体数组初始化 2 struct { 3 char *name; 4 int age; 5 } stu[2] = { {"MJ", 27}, {"JJ", 30} };
6、 结构体指针
① 指向结构体的指针的定义
struct Student *p;
② 利用指针访问结构体的成员
1 (*p).成员名称 2 3 p->成员名称
7、结构体与函数
① 如果结构体作为函数参数,只是将实参结构体所有成员的值对应地赋值给了形参结构体的所有成员
② 修改函数内部结构体的成员不会影响外面的实参结构体
1 struct Student 2 { 3 int age; 4 int no; 5 }; 6 7 // 修改函数内部结构体的成员不会影响外面的实参结构体 8 void dfy(struct Student s) 9 { 10 s.age = 30; 11 s.no = 2; 12 } 13 14 // 会影响外面的实参结构体 15 void dfy2(struct Student *p) 16 { 17 p->age = 15; 18 p->no = 2; 19 20 }
二、枚举类型
1、定义枚举类型
1 // 1.定义枚举类型 2 enum Season 3 { 4 spring = 1, 5 summer, 6 autumn, 7 winter 8 }; 9 10
2、定义枚举变量
1 2 // 定义枚举变量 3 enum Season s = 100000;
3、遍历枚举元素操作
enum Season {spring, summer, autumn, winter} s; // 遍历枚举元素 for (s = spring; s <= winter; s++) { printf("枚举元素:%d ", s); }
三、 变量类型(根据作用域范围的不同可以分为全局变量和局部变量)
1、全局变量
① 定义:在函数外面定义的变量
② 作用域:从定义变量的那一行开始,一直到文件结尾(能被后面的所有函数共享)
③ 生命周期:程序一启动就会分配存储空间,程序退出时才会被销毁
④ 默认的初始值就是0
2、局部变量
① 定义:在函数(代码块)内部定义的变量(包括函数的形参)
② 作用域:从定义变量的那一行开始,一直到代码块结束
③ 生命周期:从定义变量的那一行开始分配存储空间,代码块结束后,就会被回收
④ 没有固定的初始值
1 #include <stdio.h> 2 3 int age;//全局变量 4 5 void bianliang() 6 { 7 int age; 8 age = 10; 9 } 10 11 int main() 12 { 13 printf("%d ", age);// 0 14 15 int age = 20;//局部变量 16 17 printf("%d ", age);// 20 18 19 bianliang(); 20 21 printf("%d ", age);// 20 22 return 0; 23 }