全局变量
1.概念:在所有函数外部定义的变量,称为全局变量
2.作用:用于存储一个需要长期存于内存,并需要改变的变量
3.特点:①生命周期跟随程序,程序启动创建,程序退出才会销毁
②作用域是其所在位置之下得所有函数,都可以共享并改变
③变量的使用遵循就近原则,如果函数内有同名变量,那么函数调用的是函数内的
④如果没有初始化赋值,默认值是0
结构体
1.概念:是一种数据类型,是构造类型,里面可以存不同类型的数据
2.作用:用于封装不同的数据类型到一个结构中,方便使用
3.用法:
定义:①定义结构体类型 struct 结构体类型{ 数据类型1 名称;数据类型2 名称;...}
②定义结构体变量及赋值:struct 结构体类型 变量名={数据1,数据2...};
取值:变量名 结构体元素变量名
赋值:变量名 结构体元素变量名=新值
4.特点:①可在定义结构体类型时同事定义结构体变量名,可定义匿名类型结构体
②同一作用域内不可重复定义结构体类型和结构变量,匿名类型结构体除外
③可在函数内也可在函数外,效果及用法类型于局部变量和全局变量,也可嵌套定义
④可同事在函数内外定义同一个类型,使用同样遵循就近原则,结构体变量也是如此
结构体数组
1.概念:是数组,只不过数组里每一个元素是结构体类型
2.作用:用于储存多个有关联的结构体
3.用法:
定义:struct 结构体类型 数组名[长度]={结构体1,结构体2}
赋值:
取值:数组名[角标];单独
4.特点:遵循数组的特点
结构体的指针
1.概念:是指针,只不过指针类型是结构体类型
2.作用:用于存储结构体的地址,并操作地址对应的结构体空间里的数据
3.用法:
定义及初始化赋值: struct 结构体类型 *指针名=&结构体变量
取值:(*指针名).结构体元素名; 如:(*p).name
指针名->结构体元素名; 如p->name
赋值:*指针名).结构体元素名=新值;如(*p).name=“hello”
指针名->结构体元素名=新值; 如p->name=“hello”
4.特点:指针移动对结构体本身没有意义,结构体名并不包含第一个元素的地址
结构体分配内存空间遵循两个原则(对齐原则或对齐算法):
1.每个元素的偏移量(当前元素首地址距离整个结构体首地址的字节数)必须是自己所占有字节数的整数倍,如果不够,补齐上一个元素的字节数
2.整个结构体的字节数必须是其最大元素所占字节的整数倍,如果不够,最后一个元素填充字节
枚举
1.概念:是构造类型的一种,里面存得都是有别名的整形常量
2.作用:可以把多个整形常量以别名的形式封装成义个整体,便于别的变量识别并取值使用
3.用法:
定义:①定义枚举类型 enum 枚举类型{元素1,元素1,...};
或{元素1=0,元素2=1};
②定义枚举变量及赋值:enum 枚举类型 变量名=对应枚举里的一个元素名;
取值:变量名=枚举元素名
4.当一个变量只有固定的多个int 取值范围时
5.特点:①枚举类型智能是int 值,且不能直接用int常量,需要用别名(建议全部大写)
②如果不设定值,那么默认第一个元素是0,以此类推
③同一个作用域内不能出现重复的元素,不同的枚举类型也不行
注意:枚举一旦类型定义成功之后里面的数据常量不能再更改
共同体:同一片空间,可以存不同的数据类型,但是每次只能创建一个类型元素
如:union person per; 任意一次赋值都会把之前的数据替换
宏定义
1.概念:是一个替换代码的预处理指令
2.作用:可以在编译之前进行代码替换
3.用法:
开始替换:#define 被替换类容 替换成的内容
如:#define kLength 6表示从这行开始下面所有代码中的kLength替换成6
结束替换:#undef 被替换内容; 如:#undef kLength表示到这一行,宏定义失效
4.当需要用一些重复性代码或简单的函数运算时,可以用宏定义,提高效率
5.特点:①命名尽量以大写或小写k开头,便于区分(规范)
②被双引号括起来的不会被替换
③宏定义只会做代码替换,不会关注任何逻辑,容易出现优先级错去(加括号解决)
④替换可以设置作用域,如果不设置,作用域则是这行代码出现到代码的最后一行
|
|