---------------------- <a href="http://www.itheima.com"target="blank">iOS开发</a>、期待与您交流! ----------------------
一、变量类型
1. 变量的作用域
c语言根据变量作用域的不同,把变量分为全局变量和局部变量。
全局变量:定义在所有函数外部称之为全局变量,在定义的位置开始一直到源程序结束有效。
局部变量:定义在函数内部的变量称之为局部变量,只在所定义的函数内部有效,函数结束变量也随之销毁。
int a; // 全局变量
int main ()
{
int b; // 局部变量
return 0;
}
2. 变量的存储类型
变量的存储类型就是指变量存储在什么地方。有三个地方可以用于变量的存储,普通内存、运行时堆栈、硬件寄存器。
变量的存储类型决定了变量何时创建、何时销毁以及它的值能保持多久,也就是决定了变量的生命周期。
C语言根据变量的存储类型的不同,可以把变量分为:自动变量、静态变量、寄存器变量。
* 自动变量
用auto修饰的局部变量,存储在堆栈中,所有的变量默认都是自动变量,从声明位置到相对应的代码块结束为其声明周期,函数多次调用,此变 量就多次被新建、销毁。
* 静态变量
静态变量是存储在静态内存中的,也就是不属于堆栈。所有的全局变量和被static修饰的局部变量都是静态变量,从程序运行前被创建直到程序 结束才被销毁,只被创建一次。
* 寄存器变量
存储在硬件寄存器中的变量,称为寄存器变量。寄存器变量比存储在内存中的变量访问效率更高(默认情况下,自动变量和静态变量都是放在内存 中的),被register修饰的自动变量都是寄存器变量,只有自动变量才可以是寄存器变量,全局变量和静态局部变量不行,寄存器变量只限int、char和 指针类型变量使用,因为寄存器变量本身就是自动变量,所以函数中的寄存器变量在调用该函数时占用寄存器中存放的值,当函数结束时释放寄存 器,变量消失。
由于计算机中寄存器数目有限,不能使用太多的寄存器变量。如果寄存器使用饱和时,程序将寄存器变量自动转换为自动变量处理。为了提高运算速度,一般会将一些频繁使用的自动变量定义为寄存器变量,这样程序尽可能地为它分配寄存器存放,而不用内存。
二、结构体
1. 结构体的一般定义形式为:
struct 结构体名{ // struct 是关键字,结构体类型的标志
类型名1 成员名1;
类型名2 成员名2;
……
类型名n 成员名n;
};
struct Student {
char *name;// 姓名
int age;// 年龄
float height;// 身高
};
2. 结构体变量的定义
1> 先定义结构体类型,再定义变量
struct Student
{
char *name;
int age;
};
structStudent stu;
2> 定义结构体类型的同时在定义变量
struct Student
{
char *name;
int age;
} stu;
3> 直接定义结构体类型变量,省略类型名
struct
{
char *name;
int age;
} stu;
3. 结构体的注意点
1> 不允许对结构体本身递归定义
struct Student
{
int age;
struct Student stu;
};
2> 结构体内可以包含别的结构体
struct Date {
int year;
int month;
int day;
};
struct Student {
char *name;
structDate birthday;
};
3> 定义结构体类型,只是说明了该类型的组成情况,并没有给它分配存储空间,就像系统不为int类型本身分配空间一样,只有当定义属于结构体类型的变量时,系统才会分配存储空间给该变量。
struct Student {
char *name;
int age;
};
struct Student stu;
4> 结构体变量占用的内存空间是其成员所占内存之和,而且各成员在内存中按定义的顺序依次排列
如下面的Student结构体: 一个Student变量共占用内存:2+2+4 = 8字节
struct Student {
char *name;// 姓名
int age; // 年龄
float height; // 身高
};
4. 结构体数组
struct {
char *name;
int age;
} stu[2] = { {"CT",20}, {"AA",34} };
5. 结构体作为函数参数
将结构体变量作为函数参数进行传递时,其实传递的是全部成员的值,也就是将实参中成员的值一一赋值给对应的形参成员。因此,形参的改变不会影响到实参。
6. 指向结构体的指针
* 每个结构体变量都有自己的存储空间和地址,因此指针也可以指向结构体变量
* 结构体指针变量的定义形式:struct结构体名称 *指针变量名
* 有了指向结构体的指针,那么就有3种访问结构体成员的方式
结构体变量名.成员名
(*指针变量名).成员名
三、枚举
枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数。当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型。比如,你可以用一个枚举类型的变量来表示季节,因为季节只有4种可能的取值:春天、夏天、秋天、冬天。
枚举的一般形式:enum 枚举名 {枚举元素1,枚举元素2,……};
enum Season {spring, summer, autumn, winter};
枚举变量的定义
前面只是定义了枚举类型,接下来就可以利用定义好的枚举类型定义变量。
跟结构体一样,有3种方式定义枚举变量。
* 先定义枚举类型,再定义枚举变量
enum Season {spring, summer, autumn, winter};
enum Season s;
* 定义枚举类型的同时定义枚举变量
enum Season {spring, summer, autumn, winter} s;
* 省略枚举名称,直接定义枚举变量
enum {spring, summer, autumn, winter} s;
上面三种方式定义的都是枚举变量s
---------------------- <a href="http://www.itheima.com"target="blank">iOS开发</a>、期待与您交流! ----------------------