C语言结构体和其他数据形式
一、结构体定义
1、可声明在函数外。
2、声明:struct book {char title[10];char author[10];float money;};
3、book结构体由两个字符串数组和一个float类型变量组成的结构
4、定义结a构体在函数内:struct book a;或struct (book) { }a;
5、结构体与结构体中可以层层嵌套:struct book{struct title{ };};
二、结构体使用
1、初始化:struct book d{"name","no",11};或d.title="xxx";
2、a中有三个类型为a.title、a.author、a.money。d加点结构名进行赋值、访问和输出(不止一种方式)。
3、可以用a=b;把一个结构体赋给另一个结构体。
4、结构数组的函数
(4)、struct book a[n];
float sum(const struct book c[],int n); sum(a,n),
(5)、要点
可以把数组名作为数组中的第一个结构的地址传递给函数。
然后可以用数组表示法访问数组中的其他结构。
由于sum()函数不能改变原始数据,所以用了const。
三、结构数组
1、struct book a[10];a中有10个都有book的结构,以a[0].title访问
2、a[2].title[4]:数组a[2]元素的title成员的一个字符。
3、可以以a[0].title的形式访问。
四、指向结构的指针
1、声明:struct book *pt; pt=&a
2、告诉编译器pt指针指向a结构。
3、pt->title;或pt=&title;pt指向title地址。
4、a.title==(*pt).title==pt->title
5、若a结构为a[2]数组,则pt指向a[0],pt+1指向a[1]。
五、结构与结构指针的选择
1、struct book {char title[20];char author[20];};
2、struct book {char *title;char *author;};
3、第一个声明要分配40个字节,而第二个分配16个字节。指针可以代替数组。
六、伸缩型数组成员
1、struct book {char title[10];char author[];//伸缩型数组成员};
2、成员规则
(1)、伸缩型数组成员必须是最后一个成员;
(2)、结构中必须至少有一个成员;
(3)、数组方括号中是空的。
3、分配空间用:malloc(),free()
4、伸缩数组成员要求
(1)、不能用结构拷贝或赋值
(2)、不要以值的方式把这种结构传递给结构,要把结构地址传递给函数
(3)、不要用带伸缩型数组成员的结构做为数组成员或另一个结构的成员
七、把结构体保存到文件中
1、pbook是标识一个文件流
2、fprintf(pbook,"%s %s %.2f\n",a.book,a.author,a.money);
3、fwrite(&a,sizeof(struct book),1,pbook);
4、rewind()函数确保文件指针处于开始处。
5、fwrite()和fread()函数使用二进制文件。
八、链式结构
1、创建新的数据形式。
2、队列、二叉树、堆、哈希表和图表,都是由链式结构组成的。
九、联合类型
1、联合是一种数据类型,它能在 同一个内存空间储存不同的数据类型
2、声明:
union hold { int digit;
double bigfl;
char letter; };
3、union hold fit; hold 类型的联合变量。
4、声明联合只能存储一个int或一个double或char类型的值。
5、编译器在分配内存时,分配的是占用最大最大字节的类型。
6、fit.digit=23; 联合中,一次只存储一个值。
7、联合中还可以嵌套结构体 union data{struct hold fit; struct ···; };
十、枚举类型
1、enum spectrum {red, orange, yellow, green, blue, violet}; enum spectrum color;
2、用枚举这些颜色时,从技术层面看它们是int类型的常量,如red为0、orange为1等。
color的值可能为red,orange等。如果color要为red,则color=0
3、若enum spectrum {red, orange=10, yellow, green}; 则red=0;yellow=11,green=12。
十一、typedef
1、typedef并没有创建任何新的类型,它只是为某个已存在的类型增加了一个方便只使用的标签。
2、typedef定义的作用域取决于定义的位置。在函数中,有局部作用域;在函数外,有文件 作用域。
3、与#define三处不同
(1)、与#define不同,typedef创建的符号名只受限于类型,不能用于值
(2)、在受限范围内,typedef比#define更灵活。
(3)、typedef由编译器解释,不是预处理器。
4、使用
(1)、typedef char * STRING;
STRING name, sgin; 相当于:char * name, * sgin;
(2)、typedef struct complx { float real; int imag; }COMPLEX;
COMPLEX a={3.0,4 }; 则a为complex类型的结构。
十二、其他类型声明
1、int ** ptr; 声明一个指向指针的指针,被指向的指针指向int类型
2、int * risks[10]; 声明一个内含10个元素的数组,每个元素都是指向一个int类型的值。
3、int (* risks) [10]; 声明一个指向数组的指针,该数组内含10个int类型的值。
4、int (* uuf) [3] [4]; 声明一个指向3X4二维数组的指针,该数组内含int类型值。
5、int (* uof [3]) [4]; 声明一个内含3个指针元素的数组,其中每个每个指针都指向一个内含4个int类型元素的数组。
6、( )和[ ]的优先级相同,但比*的优先级高。
内容基于《C Primer Plus》第六版。