———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———
一、结构体
结构体在IOS开发中是经常用到的数据类型,使用频率不亚于指针,所以是非常重要的一种数据类型,但是结构体用法相对比较简单。
1.什么是结构体
实际应用中,我们通常需要由不同类型的数据来构成一个整体形容某个事物,比如有int、char *、double类型组成,c语言专门提供了结构体类型来解决该问题,他允许内部元素是不同类型的。
2.结构体的定义
格式:
struct 结构体名{
类型1 成员1;
类型2 成员2;
……
};
例如:
struct Person{
int age;
char *name;
double weight;
};
3.结构体变量的定义
注意:上面定义的是结构体类型,并不是一个结构体变量,就像char、int一样。
结构体变量的定义:
1>先定义结构体类型再定义变量
struct Person {
int age ;
char *name;
};
struct Person person; // 这里注意:struct不可省略,和Person是一个整体
2>定义结构体类型的同时定义变量
struct Person {
int age;
char *name;
} person; // 这里的person即为变量名
3>直接定义结构体变量,省略类型名
struct {
int age;
char *name;
} person; // 这种定义方式结构体类型不能够重复使用
4.结构体的注意点
1>不允许对结构体本身递归定义
例如:
struct Person {
int age;
struct Person person; //这是错误写法
};
2>结构体内部可以包含其他结构体类型
例如:
struct Date {
int year;
int month;
int day;
};
struct Person {
int age;
struct Date birthday; // 结构体内部包含其他结构体类型
};
3>结构体定义类型定义时并不分配空间,只有定义属于结构体类型的变量时才会分配空间,就像系统并不会为int类型本身分配空间一样。
4>结构体所占空间
结构体所占空间为其内部所有基本类型的整数倍,
例如
struct Person {
int age;
char *name;
};
在64位编译器下,一个Person类型的变量共占16(8+8)字节
5.结构体的初始化
1>结构体赋值,需按结构体内部变量顺序一一赋值
例如:
struct Person {
int age;
char *name;
};
struct Person person = {20,”danDan”};
2>结构体只能在定义变量的同时进行初始化赋值,下面的写法是错误的
struct Person person;
person = {20,”danDan”};
但是可以这样赋值:
struct Person person;
person.age = 20; // 对age成员进行赋值
person.name = “danDan”; // 对name’成员赋值
“.”称为成员运算符,它在所有运算符中优先级最高
3>同样,我们也可以使用“.”运算符访问结构体成员
例如:
person.age;
person.birthday.year;
6.结构体数组
1>定义
跟结构体变量一样,结构体数组也有3中定义方式:
struct Person {
int age;
char *name;
};
struct Person person[3]; // 这是第一种
struct Person {
int age;
char *name;
} person[3]; // 这是第二种
struct {
int age;
char *name;
}person[3]; // 这是第三种
这三种类型都定义了一个person结构体数组,数组元素个数为3,元素均为struct Person类型。
2>结构体数组的初始化
struct {
int age;
char *name;
} person [3] = {{20,”gouDan”},{21,”maoDan”},{22,”lvDan”}};
7.结构体作为函数参数
结构体变量作为函数参数进行传递时,形参的改变并不会改变实参的值。
例如:
typedef struct {
int age;
} Person; // 定义结构体类型
void change(Person person) // change方法的定义
{
printf(“person.age = %d”,person.age);
person.age = 20;
printf(“person.age = %d”,person.age);
}
int main()
{
Person person = {10};
change(person); // 调用change方法
printf(“person.age = %d”,person.age);
return 0;
}
上面代码的输出结果是10 20 10。
8.指向结构体的指针
每个结构体均有自己的存储空间和地址,因此指针也可以指向结构体变量
1>结构体指针变量的定义形式:struct 结构体名称 *指针名称 例如:struct Person *p;
2>访问结构体成员的方式:
结构体变量名.成员名
(* 指针变量名).成员名
指针变量名->成员名
例如;struct Person { // 定义结构体类型
int age;
char *name;
};
struct Person person = {20,”gouDan”}; // 定义结构体变量
struct Person *p; // 定义结构体指针
p = &person; // 指针指向变量地址
// 通过三种方式访问变量
printf(“age = %d, name = %s”,person.age,person.name);
printf(“age = %d, name = %s”,(*p).age,(*p).name);
printf(“age = %d, name = %s”,p->age,p->name);
二、枚举
1.枚举的概念
枚举也是C语言的一种基本类型,并不是结构体类型,他可以用于声明一组常数。当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型。比如季节、月份、星期等。
2.枚举类型的定义
格式:enum 枚举名{枚举元素1、枚举元素2…};
例如:enum Season {spring,summer,autumn,winter};
3.枚举变量的定义
跟结构体类似,枚举也有三种定义变量的方式:
1>先定义枚举类型再定义枚举变量
enum Season { spring,summer,autumn,winter};
enum Season s;
2>定义枚举类型的同时定义枚举变量
enum Season{ spring,summer,autumn,winter}s;
3>省略枚举类型名称
enum { spring,summer,autumn,winter} s;
4.枚举使用注意
1>C语言编译器会将枚举元素作为常量处理,成为枚举常量。
2>枚举元素取值决定于各枚举元素的先后顺序。默认情况下,第一个元素为0,后面元素依次加一,与数组下标类似。
所以上面定义的枚举类型四个值为0、1、2、3;
3>可以在定义枚举类型时改变枚举值
例如 enum Season { spring,summer = 4,autumn,winter};
赋值元素之前的元素不变,依然为0,而后面则依次加1,为4、5、6。
4>赋值
enum Season { spring,summer,autumn,winter}s;
s = spring; // 等价于s = 0;