课程-其他类型
根据变量的作用范围可以分为两类(根据不同的标准可以分为许多不同的类,例如临时变量,静态变量等等)
1.局部变量:
定义:在函数(代码块)中内部定义的变量,定义局部变量时必须初始化,如果在定义时没有初始化,那么局部变量的值会是未知的,在程序中使用可能会发生错误。
作用域:从定义变量的那一行开始,一直到所在代码块结束,
生命周期:在定义的那一行开始才分配存储空间,当所在代码块结束后,就会被回收。
函数的形参属于局部变量,当一个函数定义了形参时,在调用这个函数时就会在这个函数内部创建形参变量的空间,通过值传递的方式,接收传递的实参,即形参通过实参来初始化。
2.全局变量:
定义:在函数外部定义的变量,有自己的默认初始化值。
作用域:全局变量作用域很广,可以跨项目使用,但从一般来说,是从定义的那一行开始,一直到当前文件的结尾,能被之后的所有函数共享访问。
生命周期:程序一启动,就会分配存储空间,只有程序退出时,才会被收回,即全局变量在程序运行过程中是一直存在的。
在程序运行时,先就近找所涉及的变量,如果没有找到,则会继续往外找相应的变量,所有的程序都是从main函数开始按语句顺序往下运行的,如果是在函数内部中调用其他函数,例如在main函数中调用其他函数a(),则在a执行完毕后,a在内存空间中就会自动释放,a函数中所涉及的局部变量也会一同释放。
结构体:
结构体也是一种数据类型,在ios开发中经常使用。
结构体是构造类型,由多个基本数据类型组合而成的类型称为构造类型。基本数据类型有int ,double ,float,char等等,数组也是构造类型,但是一个数组只能存放同一种基本数据类型。
而结构体可以由多种基本数据类型组成,定义结构体首先定义一个结构体变量,格式如下:
结构体类型 结构体变量名();
而其中的结构体类型是需要自行定义的,在系统中默认是没有结构体类型的
用struct 定义一种结构体类型
struct 结构体类型名;
{
定义结构体的成员或是属性;
该结构体类型中所包含的基本数据类型和变量;
};注意:大括号后面必须跟分号“;”。
也可以这样定义:
struct a{...} b; struct a{} 是类型,b是类型变量名,然后跟分号结束语句。
类似与 int a;,int 是类型,a是变量名,接分号结束语句。
用“结构体变量名.属性变量名”来访问该类型结构体的成员(属性)。
也可以一次给所有属性赋值:
struct 结构体类型 结构体变量名={"结构体属性1的值","结构体属性2的值","结构体属性3的值".。。。}顺序与定义结构体是定义的属性顺序相同。
只能自声明结构体变量时使用一次性赋值操作,之后在进行赋值时必须用“。属性”来进行赋值操作。在定义数组时也一样,数组名代表地址,相当于地址值常量,
给地址值常量赋值是错误的操作。
学生通讯录,书,等等都可以用结构体去定义.
结构体内存分析:
在定义结构体类型时,并没有分配内存空间,而在定义结构体变量时,才会真正分配内存空间,
而一个结构体变量所占的内存字节数是结构体类型中的所有属性所占的内存字节数相加的和
可以通过sizeof(结构体变量名)来获得该结构体变量所占的字节数。(sizeof返回一个变量所占的总字节数,而strlen返回一个数组的总字符数??)
例如:
char str[100]="abc";
strlen 结果3
sizeof结果100
在分配结构体内存时,有一个补齐算法,即结构体变量所占的内存字节数是属性中所占内存最大字节的倍数,即首先计算属性总和,如果和是倍数则刚好
如果和不是倍数则会自动增大补齐为倍数,补齐算法是由计算机内存结构决定的,方便内存底层的实际操作。
结构体在OC中频繁使用,必须掌握好相关细节。
结构体类型不能重复定义,只能定义一次,没有重载。以下:
struct a{}b;
struct a{}c;
是错误的,重复定义了同一种类型的结构体,
但是可以通过匿名结构体类型进行多次定义。 例如
struct {}stu1;
struct{}stu2;
是正确的,因为是匿名结构体。
结构体类型的作用域:
定义在函数中时,从定义类型的那一行开始,到所在的代码块结束。相当于局部变量。
定义在函数外部时,相当于全局变量。
但是不管定义在函数内部或是外部,开始生效都是从定义时的那一行开始的,因此,定义的顺序也很重要。即如果想定义的是一个全局范围的,最好放在最顶部,如果是在中部定义的,则只能是从中部之后才是它的作用范围,因此,全局变量常常定义在程序的最开始处。
在定义变量时遵循就近原则,在C中没有重载的功能。
结构体数组:
结构体数组可以应用在游戏积分榜中,即有多个同类型的结构体变量,包含有相同的属性,但是属性的值不同。
数组,用于存放多个相同类型的数据,定义数组如下:
数组元素类型 数组名[]={数组元素};
因此对于结构体变量而已,结构体变量的类型是对应的自定义的结构体类型:struct 结构体类型名
则,结构体类型数组定义如下:
struc 结构体类型名 数组名[]={};
把结构体变量放入数组中,相当于是一个N维数组;
在定义任何结构体变量时,只能在声明时一次定义所有属性,之后想要修改定义的属性,只能通过单独修改对应的属性值来完成,不能再通过一次性赋值完成。
指向结构体的指针:
指向结构体变量的指针在实际开发中也经常应用,必须掌握。
定义结构体变量指针也一样 :变量类型 指针名。
指针用于间接操作结构体变量,而获取结构体变量的地址也和普通一样 &结构体变量名。
当指针指向一个结构体变量后,就可以访问该变量的属性 :
(*p).属性
加括号表示是一个整体,即指向了一个结构体,使用*号,表示取出所指向地址所存储的值,
p=&stu; *p=stu,*和&号是反操作。
在实际中最常用的方式:使用右箭头符号:->
p->属性
这是最常用的方式,不用写*号。
结构体嵌套:
结构体可以相互嵌套,但是不能自己嵌套自己。
相互嵌套的结构体在定义是可以通过“声明时可以一次定义所有属性”这一特点来完成赋值,例如:
struct student{ struct a{};structb{};... };
struct stu={....{....},{......]};
既可以通过大括号嵌套来完成赋值操作。
(共用体不要求,开发中不使用)
枚举类型:
枚举类型在开发也是经常使用的, 枚举类型用于限制变量的取值,枚举类型的本质是INT类型,实际上是为类方便阅读代码而设置的,功能是用有意义的单词代替INT整数。没有其他作用,只是方便阅读代码而已。
首先定义枚举类型,然后在定义枚举变量。
enum 即表示一个枚举类型,和struct一样。
enumeration:枚举。缩写 enum。
例如 :
enum season(枚举类型名)
{
该枚举类型允许取的值;其实这些值在内存中是以整形常量的方式存储的(按顺序默认常量值为0,依次加1),并不存储实际的字面信息。
}; 不要忘记写分号,自定义的类型都要写上分号,定义类型不是定义函数,定义类型是一个语句,语句结束必须用分号结束。
定义枚举变量,也是一样的 :数据类型 变量名;
同样也可以定义匿名的枚举类型,然后在定义一个枚举变量。
但在C中,枚举类型并不严格,即使赋值的范围不在枚举之中,一样可以通过编译。
枚举类型用于规范代码。
数据类型总结:
基本数据类型:int,long int=long ,short int =short,unsigned int =unsigned(常用unsigned),signed(不常用)
float,double ,char(永远是占一个字节,而其他类型在不同的系统中所占字节可能不同。)
构造类型:数组,只能有一种类型的数据构成;结构体,可以由不同类型数据组成。
指针类型:
枚举类型: