c语言学习笔记之结构体,枚举

来源:互联网 发布:linux cp 文件夹覆盖 编辑:程序博客网 时间:2024/05/18 19:21
//---------------------结构体

什么是结构体?

答:若干个相同或者不同类型的数据组成的新的类型


如何定义结构体

struct 结构体名{

    成员列表;  格式类型 变量名;

};




//-----------------结构体变量

结构体变量特点:

一个复合类型,具备结构体的特性

struct stu{

    int age;

}stu1,stu2;



//匿名结构体

struct{

    int model;

}s1; //


//先定义结构体,后定义变量

struct stu stu3;


//------------------结构体变量中成员的访问方法


结构变量名.成员名


点语法

boy1.num             boy1的学号

boy2.sex             boy2的性别

boy1.birthday.month  boy1的生日的月份



//-------------------如何初始化结构体变量

初始化的时候,注意成员的顺序

//先定义结构体变量,后初始化

struct stu{

    int age;

    char name[20];        //字符串数组

//    char *name2;          //字符串指针

}stu1;


stu1.age =10;


stu1.name = "xxx" ;             //错误的

strcpy(stu1.name,"xxx");        //正确的  通过strcpy方法

stu1.name2 = "xxx"              //正确




struct stu1 = {18,"xxx"};


//定义同时进行初始化  严格遵守定义顺序


1)全部输初始化

struct stu{

    int age;

    char name[20];

}stu1={23,"sss"};


2)部分初始化

struct stu boy1={.name="weige"};




//---------------------结构体存储空间

结构体在内存中占用的存储空间是 所有元素占用空间之和(考虑对齐)

1.逐个元素对齐(下个元素与之前所有元素之和对齐)

2.整体对齐(最后的和能单独整除所有元素)-->  最后能整除最长类型



//-------------------结构体作用域

全局  Person


{

局部  Person

  

    Person

}  局部的被释放了



Person

1、结构体的数组

定义:由相同类型的结构体变量组成的有序的集合。

定义格式:

1) 定义结构体的同时定义结构体数组

struct Car{

    int lunzi;

    int speed;

}cars[5];


2) 使用匿名结构体定义数组

struct {

    int lunzi;

    int speed;

}cars[5];


3)先定义结构体,再定义结构体数组

struct Car cars[5];


初始化:

1) 定义结构体数组的同时进行初始化

struct Car{

    int lunzi;

    int speed;

    char name[20];

}cars[2]={{2,50},{80,300}};


2) 匿名

struct {

    int lunzi;

    int speed;

    int speed;

}cars[2]={{2,50},{80,300}};

3)

struct Car cars[2]={{2,50},{80,300}};


4)先定义数组,后初始化

cars[0].lunzi = 4;

cars[0].speed = 200;

//cars[0].name="xxxx"; 错误的

strcpy(cars[0].name,"xxxx"); const char a;


通过数组角标整体去初始化 cars[1]=(struct Car){6,100};



2、结构体指针

定义:指向结构体的指针

格式:结构体类型 * 结构体指针变量名;

struct Student stu1;

struct Studetn *pstu;

pstu = &stu1;


作用:可以间接访问结构体变量中保存的成员变量值

(*pstu).name

(*pstu).sno 新的访问方法

pstu->name  // 只有结构体指针变量才可以

等价于 (*pstu).name



3、结构体与函数之间的关系

1)结构体变量作为函数的参数 (值传递)

2)结构体指针作为函数的参数 (地址传递)



4、枚举类型

使用场合:在开发中,如果一个变量只有有限的几个取值,可以使用枚举


1)枚举类型

enum 枚举类型名{枚举值1,2,3,...};


2)枚举类型的变量

enum SEX{man,women,yao}isex;

enum {man,women,yao}s1;

enum SEX s2;


3)枚举类型变量的使用

1)枚举元素的值

系统默认给枚举变量第一元素赋值为0,后面的元素依次是上一个元素+1


2)给枚举类型变量赋值

isex = man;

printf("%d\n",isex);



5typedef定义类型

定义:给已经存在的数据类型取一个别名

格式:typedef 原类型 新类型名//新类型名尽量要大写


5.1、基本数据类型

typedef int  MALATANG;  别名: MALATANG


5.2、用在数组,给数组起别名

typedef int  ARRAY[5];  别名: ARRAY


5.3、给结构体其别名

typedef struct Person P;  别名: P

typedef struct { int screenSize; int ram;} IPHONE; 别名: IPHONE


5.4、给枚举类型起别名

typedef enum Sex{kSexMan,kSexWomen,kSexYao} ISEX;  别名: ISEX


5.5. 给函数指针起别名

typedef int (*FUN)(int,int); 别名:FUN



6、预处理指令的概念

定义:以“#” 开头的一些特殊的指令


作用:

在编译之前做些处理(宏展开,条件编译,文件包含)


常见的预处理指令


:特殊的标示符

宏替换 :在编译之前,在源文件中,所有出现宏名的地方 都用宏代表的字符串 去替换

注意:宏不是语句,不需要分号结束


1)无参宏

#define 宏名 宏代表的字符串

#define M 10

#define AREA 3.14*M*M

#define PI 3.14


2)有参宏

#define Mi(y) y*y+3*y   // y 是形参,不分配空间,不需要写类型

#define MAX(a,b) a>b?a:b

#define SUM(a,b) a+b


7、条件编译

当条件满足的时候去编译一段代码

好处:可移植、生成更小的目标文件

格式:

#if


#elif


#else


#endif


0 0
原创粉丝点击