------- android培训、java培训、iOS培训、.Net培训、期待与您交流! ----------
虽然结构体的用法很简单,但是OC里面用的频率很高,所以也是一个跟指针一样重要的知识点。
C语言构造类型:
由一个或者多个已定义类型的元素用构造的方法,构造新的类型
构造类型有三种:
数组类型 结构体类型 共用体(联合)类型
其中,结构体:
是由一个或者多个相同或者不同的数据类型组成的构造类型
一、结构体
1、定义:
struct 结构体名{
成员列表;
}; //注意此处的分号不能省
//定义一个iPhone的结构体
struct iPhone{
char *color;
float screenSize;
int sn;
int imei;
};
2、结构体变量及定义方法
1)先定义结构,再说明结构变量
struct stu{
int num;
char name[20];
char sex;
float score;
};
struct stu boy1,boy2;
2)在定义结构类型的同时说明结构变量
struct stu{
int num;
char name[20];
char sex;
float score;
}boy1,boy2;
3)匿名结构体定义结构变量
struct{
int num;
char name[20];
char sex;
float score;
}boy1,boy2;
注意:定义结构体完成后,并不会给结构体分配存储空间,定义结构体变量后才分配空间。
结构体变量中成员的访问方法:
结构体变量名.成员名
如果成员也是一个结构体,则:
结构体变量名.成员名.成员名...
3、结构体变量的初始化
1)先定义结构体变量,然后再初始化
struct stu boy1,boy2;
boy1.num = 1010;
strcpy(boy1.name, "bbbbb");
//boy1.name="cjk"; //这是错误的,相当于char name[20], name="abc"; 如果写成char *name, 则name="abc"可以;
boy1.sex = 'f';
boy1.score = 18.0f;
2)定义的同时初始化
(1)全部初始化
//方法1:
struct stu{
int num;
char name[20];
char sex;
float score;
} av1={1012,"zhangsan",'f',30};
//注意 "xzmly"初始化赋值给了name[20];
//方法2:
struct stu boy1={1011,"lisi",'f',23};
//注意:初始化的顺序必须与结构体定义的时候成员的顺序一致
<pre name="code" class="plain">//使用另外一已经存在的结构体初始化新的结构体//两个相同类型的结构体变量的赋值,相当普通变量的赋值,是整体拷贝,而不是地址赋值,例:
struct Student stu1 = {"wangwu",12,'f'};
struct Student stu2;stu2 = stu1; // 这相当于把stu1里面所有的成员元素赋值给了stu2
(2)部分初始化
structstuboy1={.name="highge"}; //只给name单独赋值{}不能少
4、结构体变量存储原理
结构体占用的内存空间是每个成员占用的字节数之和(考虑对齐问题)
计算方法:
1)先找对齐模数
2)再计算结构体变量中各个成员占用的字节和
struct A{
short a; // 2字节 + 2 下面是4,2不是4的倍数,所以加上2
int b; // 4字节 上面加起来是8个字节,下面是1,8是1的倍数,所以不加
char c; // 1字节 + 7 上面下面是8,上面加起来是9,9不是8的倍数,所以加上7
double d; // 8字节 直接相加是24,24正好是这里面所有数字的倍数,所以就是24
};
struct B{
double d; // 8字节 下面是2,8是2的倍数,所以不加
short a; // 2字节 + 2 上面加起来是10,下面是4,10不是4的倍数,所以加上2
int b; // 4字节 上面加起来是12,下面是1,12是1的倍数,所以不加
char c; // 1字节 + 7 所有的加起来是17,17并不是2 8 4 的倍数,所以要成为所有的倍数需要加上7最后得24
};
二、结构体数组
结构数组的每一个元素都是具有相同结构类型的下标结构变量
1、结构数组的定义:
struct 结构名{
成员表列;
}数组名[数组长度];
struct stu{
int num;
char *name;
char sex;
float score;
}boy[5];
2、结构数组的初始化
1)定义的同时进行初始化
struct stu s[2]={{12,"sb"},{18,"fengjie"}};
2)先定义,后初始化,整体赋值
s[1]=(struct stu){23,"xiaoluo"}; // (struct stu)不能少
3)先定义,后初始化
s[1].age=12; strcpy(stu[1].name, "xxoo");
三、结构体指针
结构体指针变量中的值是所指向的结构体的首地址
1、定义
struct 结构名 *结构指针变量名
2、结构体指针间接访问成员值
(*结构指针变量).成员名
或为:
结构指针变量->成员名
四、结构体嵌套
成员又是另一个结构体变量,即构成了嵌套的结构
Struct Date{
int month;
int day;
int year;
}
struct stu{
int num;
char *name;
char sex;
struct Date birthday; Float score;// 包含了Date结构体的结构变量
}
注意:结构体不可以嵌套自己的变量,但可以嵌套自己类型的指针
//定义一个全局结构体,作用域到文件末尾
struct Person{
int age;
char *name;
struct Person *son;
};
struct Person son = {4,"kim"};
struct Person p = {30,"lzy",&son};
printf("name = %s,son name = %s\n",p.name,p.son->name);
五、结构体指针作为函数的参数
void changeTime(struct Time *time);
struct Time t;
changeTime(&t);
枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解成为任何基本类型
1、定义
enum 枚举类型名{枚举值表};
2、枚举变量的定义和使用
1)先定义类型,后定义变量
enum weekday{sun,mou,tue,wed,thu,fri,sat};
enum weekday a,b,c;
2)同时定义变量和类型
enum weekday{ sun,mou,tue,wed,thu,fri,sat }a,b,c;
enum { sun,mou,tue,wed,thu,fri,sat }a,b,c;//匿名定义
关于枚举类型的代码段
#include <stdio.h>
//默认值 0 1 2
//手动赋值 5 6 7
enum iColor{kIcolorWhite=5,kIcolorBlack,kIcolorTHJ};
int main(int argc, const char * argv[]) {
//1、枚举类型变量的定义
enum iColor iPhoneColor; //iPhoneColor的取值是有要求的
//取值应为kIcolorWhite,kIcolorBlack,kIcolorTHJ中的其中一个
enum Sex{kSexMan,kSexWomen,kSexYao} isex;
//2、枚举类型变量的初始化
//给枚举变量赋值
iPhoneColor = kIcolorTHJ;
isex = kSexYao;
//3、枚举变量如何使用
printf("%d\n",iPhoneColor);
//4、枚举变量的值
//枚举类型定义完成以后,系统会自动给枚举的每个元素都会赋值一个整形的初值
// 默认初值:从第一个元素开始值为0,以后个元素的值,是上一个元素的值+1,
//5、应用
struct Person{
char *name;
//char sex; //'z'
enum Sex isex; //kSexMan,kSexWomen,kSexYao
};
//6、不按套路的出牌
iPhoneColor = 3.4; //尽量不要这么干
printf("%d\n",iPhoneColor);
return 0;
}