1.局部变量:
>定义. 在代码块内部定义的变量都是局部变量, 包括形参
>作用域.从定义变量的那一行开始,一直到代码块结束
>存放位置.存放在栈中
>生命周期.执行到定义变量的那一行开始分配存储空间,代码块结束后就释放
>特点:没有固定的初始化值
2.全局变量:
>定义.在函数外定义的变量
>.作用域.从定义变量的那一行开始,一直到文件末尾
>存放位置.静态区
>生命周期.程序一启动就会分配存储空间,知道程序结束才会释放
特点:默认初始化值是0
结构体的基本概念:
基本数据类型
char int float double
构造类型
数组,用来保存相同类型的数据
结构体,用来保存不同类型的数据
定义结构体变量分为两部:
1.定义结构体类型
2.通过结构体类型定义结构体变量
struct 结构体类型名称
{
成员(属性)
}
struct Person
{
char *name; // 姓名
int age; // 年龄
double height; // 身高
};
通过结构体类型定义结构体变量
struct Person p;
给结构体赋值要通过.的方式赋值
结构体初始化的第一种方式
p.age = 28;
p.height = 1.75;
p.name = "jyk";
结构体初始化的第二种方式
struct Person p = {"jyk", 29, 1.73};
结构体初始化的第三种方式
struct Person p = {.height = 1.88, .name = "jyk", .age = 28};
结构体在分配存储空间的时候有一个补齐算法
结构体所占存储空间的大小,必须是占用内存最大成员的字节数的倍数
定义结构体类型的时候不会为结构体类型分配存储空间
struct Date
{
int year; // 年
int month; // 月
int day; // 日
};
2.定义结构体变量
只有在定义结构体变量的时候才会真正的分配存储空间
结构变量存储值也数组也一样,也是从小到大的存,
也就是说从第一个成员开始存放
结构体变量的地址就是它第一个成员的地址
1.第一种方式:先定义结构体类型,再定义结构体变量
1.定义结构体类型
struct Student
{
int age;
char *name;
};
2.通过结构体类型定义结构体变量
struct Student stu;
2.第二种定义方式:定义结构体类型的同时定义结构体变量
struct Student
{
int age;
char *name;
} stu;
3.第三种方式:定义结构体类型的同时定义结构体变量,并且这个结构体类型没有名称
缺点:不能复用
struct
{
int age;
char *name;
} stu;
struct
{
int age;
char *name;
} stu2;
结构体类型的作用域:
1.定义在函数外面: 全局有效(从定义的那一行开始一直到文件末尾)
2.定义在函数里面:局部有效(从定义的那一行开始一直到函数结束)
结构体指针
变量类型 *变量名;
struct Student *sp;
sp = &stu;
*sp == stu
stu.age
注意点:.的优先级要比*的优先级高, 所以要先用()提高*的优先级
当利用指针指向结构体变量后的几种访问方式
1.变量名.成员 stu.age;
2.(*指针变量名).成员; (*sp).age;
3.指针变量名 ->成员; sp->age;
结构体的嵌套定义:
定义结构体类型的时候,类型当中的成员还是一个结构体
struct Clerk
{
int no;// 员工号
int age;// 年龄
struct Date birthday;
};
如果结构体中的成员还是结构体的时候 可以通过.逐层访问
枚举:
枚举是一种基本数据类型
当某一个变量只有固定的几个取值的时候可以定义枚举变量
想定义枚举变量必须先定义枚举类型,定义枚举类型的作用是告诉系统枚举有哪些取值
1.先定义枚举类型
enum 枚举名称
{
取值
}
枚举的本质就是整型
2.通过枚举类型定义枚举变量
虽然表面上看上去只能给枚举变量赋值我们定义的几个固定的值,
但是枚举变量的本质就是一个整型变量所以也可以赋值其它整型常量