结构体学习笔记
11.1枚举
当需要连续多个常量时,可以用枚举避免多个const int定义。
枚举格式:enum 枚举类型名称{名字0,……,名字n};
enum COLOR{RED,YELLOW,GREEN}; RED==0,YELLOW==1,GREEN==2
如果是连续的,可以最后定义一个number,因为正常是从0开始排,最后一个就是常量的个数:
enum COLOR{RED,YELLOW,GREEN,num};
如果需要,也可以直接给出常量的值:
enum COLOR{RED=1,YELLOW,GREEN=5}; RED==1;YELLOW==2,GREEN==5;
注意:
void f(enum color c); 作为参数时,对于C语言来说,必须要加上enum。
11.2结构
11.2-1结构类型
一个变量只能表示一个数据。如果要想让一个整体可以表示多个数据,就需要用到结构
1.结构类型声明:
struct date { int month;//成员变量,可以是不同类型 int day; int year; };//注意加分号 //结构类型声明不是实体,它相当于告诉程序有一个结构长这个样子,像一个模板 struct date today//定义结构变量,相当于把模板给它,是个实体。(一定要加上struct) //结构变量可以有多个
与本地变量一样,如果在函数中声明结构类型,那么这个结构类型只能在函数中发挥作用。
因此一般都是在函数外声明结构类型,让其在任何地方都能用。
2.声明结构的形式:
1.struct point { 2.struct { 3.struct point{ int x; int x; int x; int y; int y; int y; }; }p1,p2; } p1,p2; struct point p1,p2; p1,p2是结构变量,且 声明和定义同时完成 p1,p2都是结构变量 该结构没有名字(只要 (常用) p1,p2,不再用这个结构类型)
3.结构的初始化:
struct date { int month; int day; int yeat; }; struct date today ={07,31,2014};//按顺序赋值 struct date thismonth ={.month=7,.year=2014};//赋所给的值,没给值的系统会赋个0
4.结构成员和结构运算:
访问结构成员,用点运算符(.):p1.x,p1.y (点的左边必须是一个结构)
访问整个结构,直接用结构变量的名字
p1=(struct point){5,10};//相当于p1.x=5;p1.y=10 (括号内为强制类型转换) p1=p2;//相当于p1.x=p2.x;p1.y=p2.y
5.结构指针:
结构变量的名字不是结构变量的地址,必须使用&运算符
struct date *pDate=&today;
11.2-2结构与函数
结构变量可以作为函数的参数将他的值(x,y……)传入函数,这时是在函数内新建一个结构变量,并进行复制。
也可以让函数返回一个结构。
int numberOfDays(struct date d)//使用时可以不用struct date
要实现一次输入结构变量里的值,可以用以下代码:
#include <stdio.h> struct point { int x; int y; }; struct point getStruct(void); //getStruct函数,不用参数,因为输入的结构无法通过函数改变。 //所以直接在函数中定义结构变量,最后把它输出交给外面的结构变量 int main() { struct point y={0,0}; y=getStruct(); printf("%d,%d",y.x,y.y); return 0; } struct point getStruct(void) { struct point p; scanf("%d",&p.x); scanf("%d",&p.y); return p; }
如果这个结构很大,传入函数时新建一个结构会费时间和空间,所以最好是传结构指针。
用->表示指针所指的结构变量的成员 struct date *p=&myday; 本来:(*p).month=12; 简便化:p->month=12;
所以就可以优化getStruct函数:
struct point getStruct(struct point *p) { struct point p; scanf("%d",&p->x); scanf("%d",&p->y); return p; } 返回的是一个指针p,这个指针又能和*运算符结合,表示出原来的结构变量
11.2-3结构中的结构
1.结构数组:一个数组,每个单元都是一个结构
//struct date dates[100]; struct date dates[]={ {4,5,2005},{2.4.2005} };//最外面的括号是数组的初始化,里面的括号是结构的初始化,分别表示两个数组的值。
2.结构中的结构:
一个结构中的成员变量也可以是另一个结构:
struct DateAndTime { struct date sdate; struct time stime; };
11.3联合
11.3-1类型定义
在定义一个结构变量是,我们总是要在变量前加上struct 结构名,减少了代码可读性。所以我们可以通过typedef来改善。
typedef可以给一个类型一个新的名字,这个名字为最后一个单词。(中间可能会有很多东西)
typedef int length; 则length a,b,len;==int a,b,len;
对于结构:
typedef struct ADate { //此处可以不用结构名,因为会有新名字 int month; int day; int year; } Date; //struct ADate结构的别名为Date,可以用Date替代struct ADate Date d={9,1,2005};
11.3-2联合
联合用union表示,它和struct相似:
union AnElt { int i; char c; } elt1,elt2; elt1.i=4; elr2.c='a'; elt2.i=0xDEADBEEF;
不同之处在于:
对于struct,两个成员的值是分开的,随时可以使用其中一个;
对于union,所有成员共同使用一个内存空间。任意时间内只能存放一个成员的值
对成员的值修改会对原有的值进行覆盖:
union的大小是其最大的成员,对其初始化只能是对第一个成员赋值。