C语言 结构体struct、联合体union、枚举enum

结构体声明:

struct  book {

char title[MAXTITL];

char author[MAXAUTL];

float value;

};结构体布局告诉编译器数据应该如何去表示,没有为数据分配空间

struct book library(结构体变量),*ptbook(结构体指针);创建结构体变量为数据分配空间 ,创建指针的时候没有分配内存空间

访问结构体成员:

使用结构成员运算符 (.)访问结构的成员例如:library.title

结构的初始化器:

struct  book library= {

.title = "sdf";

.author = "dsfa";

.value = 12;

};

结构体数组:struct book library[100];library[0].value

结构体的嵌套:在结构中引用结构体,使用的时候通过结构体变量.结构体变量.结构体成员

结构体指针:struct book library(结构体变量),*ptbook(结构体指针) pt = &library

结构体指针的声明没有创建一个新的结构。但是可以指向任意一个现有类型的结构成员

结构体指针初始化:ptbook=&library;结构体的名称不是结构体的地址因此我们需要在结构体的名称前面加上&运算符

访问结构体指针:

第一种:使用 -> 运算符 利用指针结构体对结构体成员进行访问;ptbook->title == library.title

第二种:通过*与&一对可逆运算符进行操作,(*ptbook)= = library

向函数传递结构的信息:

传递结构成员:相当于值传递进行操作,如果需要更改原始数据需要利用地址传递进行操作

传递结构的地址:将结构体的地址传递给结构体的指针,通过指针来访问结构成员

传递结构:结构体传递给结构体相当于复制一个副本进行

结构体可以一个结构体赋值给另外一个结构体(数组不可以)

结构体可以把结构体本身作为参数传递也可以把结构作为返回值返回

结构和结构指针的选择:选择结构指针作为参数还是选择用结构作为参数和返回值

结构指针:传递地址,执行效率比较高,但是无法保护原始数据

传递结构:在处理数据的时候处理的是原始数据的副本,可以保护原始数据;较老的版本没有办法实现,传递结构浪费时间和空间

在追求效率的时候我们会采用结构指针作为函数的参数,防止原始数据被意外修改,我们使用const限定符

结构中的字符数组和字符指针

结构变量中的字符指针应该是用来在程序中管理已经分配或者在别处分配的字符串,在结构中储存字符串,用数组比较简单,用结构体也可以,但是我们使用错误会导致严重的错误。

可以使用malloc()分配内存并使用指针使用该地址,在结构体中就可以使用指针处理字符串了

使用maloc()动态申请内存地址:(char*)malloc(strlen(需要的字符串长度)+1)

 

union:在同一内存中储存不同的数据类型(无规律、事先不知道顺序的混合类型)(不是同时存储),只能存储其中定义的一个

 

enum:用符号名称来表示整形常量;enum常量是int类型,只要能使用int类型的地方就可以使用枚举类型

枚举在默认情况下枚举中的常量被赋予1、2、3等;枚举在声明的时候可以为枚举指定整数值,如果在指定的时候对应对后续的枚举常量会被赋予后续的值

 

typedef:类型自定义;typedef创建的符号名称名只限于类型不能用于值

#define  STRING char *        STRING a,b == char *a,b

typedef char * STRING       STRING a,b == char *a,*b

typedef 没有创建任何类型,只是为已经存在的类型给出了一个方便的标签

 

函数指针:指针保存的是函数代码的起始地址,声明函数指针的时候我们应该和声明数据指针的时候一样,必须声明函数所指的类型(返回值类型和形参类型)

void (*pf) (char *)    pf指向函数的指针      声明函数指针以后将类型匹配的函数地址赋值给函数指针

函数指针的用法:

void x();   char mis[] ="asdfaf"; void  (*pf)(char *p);    (*pf)(mis) == pf(mis)

猜你喜欢

转载自blog.csdn.net/qq_20599225/article/details/81514421