C语言结构体和其他数据形式

 

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》第六版。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值