3.1 枚举

3.2 结构

3.3 类型定义

3.1 枚举

枚举是一种用户定义的数据类型,它用关键字enum以如下语法来表明:

enum 枚举类型名字{名字0,...,名字n};

枚举类型名字通常并不真的使用,要用的是在大括号里的名字,因为它们就是常量符号,它们的类型是int,值则依次从0到n。如:

enum colors{red, yellow, green};

就创建了三个常量,red的值是0,yellow的值是1,而green的值是2

当需要一些可以排列起来的常量值时,定义枚举的意义就是给了这些常量值的名字

套路:自动计数的枚举

这样需要遍历所有的枚举量或者需要建立一个用枚举量做下标的数组的时候就很方便了

 #define _CRT_SECURE_NO_WARNINGS

 #include <stdio.h>

 enum colors
{
red, yellow, green, numcolors//枚举的套路,最后一个放颜色的数量
}; main()
{
int color = -;
char *colorsnames[numcolors] = { "red","yellow","green" };
char *colorname = NULL; printf("输入你喜欢的颜色的代码:");
scanf("%d", &color); if (color >= && color < numcolors)
{
colorname = colorsnames[color];
}
else
{
colorname = "unknown";
} printf("你喜欢的颜色是%s\n", colorname); system("pause");
}

枚举量

声明枚举量的时候可以指定值

 enum colors
{
red = , yellow, green =
};

枚举只是int

即使给枚举类型的变量赋不存在的整数值也没有任何warning或error

虽然枚举类型可以当作类型使用,但是实际上很(bu)少(hao)用

如果有意义上排比的名字,用枚举比const int方便

枚举比宏(macro)好,因为枚举有int类型

3.2 结构

和本地变量一样,在函数内部声明的结构类型只能在函数内部使用

所以通常在函数外部声明结构类型,这样就可以被多个函数所使用了

类似数组,初始化的时候没有全部赋值,没有赋值的元素是0

     struct date
{
int month;
int day;
int year;
}; struct date today = { , }; printf("%d,%d,%d\n", today.month, today.day, today.year);

结构运算

要访问整个结构,直接用结构变量的名字

对于整个结构,可以做赋值、取地址,也可以传递给函数参数

     struct point
{
int x;
int y;
}; struct point p1, p2; p1 = (struct point) { , };//相当于p1.x = 5;p1.y = 10; p2 = p1;//相当于p1.x = p2.x;p1.y = p2;y;

数组无法做以上两种运算

结构指针

和数组不同,结构变量的名字并不是结构变量的地址,必须使用&运算符

struct date *pDate = &today;

结构作为函数参数

int numberofdays(struct date d);

整个结构可以作为参数的值传入函数

这时候是在函数内新建一个结果变量,并复制调用者的结构的值

也可以返回一个结构

这与数组完全不同

输入结构

没有直接的方式可以一次scanf一个结构

结构指针作为参数

K & R说过(p.131)

"if a large structure is to be passed to a function, it is generally more efficient to pass a pointer than to copy the whole structure"

指向结构的指针

     struct date
{
int month;
int day;
int year;
}; struct date today;
struct date *p = &today; (*p).month = ; p->month = ;

用->表示指针所指的结构变量中的成员

结构数组

struct date dates[100];

struct date dates[]=

{

{4,5,2005},

{2,4,2005}

};

结构中的结构

struct dateAndTime

{

struct date sdate;

struct time stime;

};

嵌套的结构

struct point

{

int x;

int y;

};

struct rectangle

{

struct point pt1;

struct point pt2;

};

如果有变量

struct rectangle r;

就可以有:

r.pt1.x

r.pt1.y

r.pt2.x

r.pt2.y

如果有变量定义:

struct rectangle r, *rp;

rp=&r;

那么下面的四种形式是等价的:

r.pt1.x

rp->pt1.x

(r.pt1).x

(rp->pt1).x

但是没有rp->pt1->x(因为pt1不是指针)

3.3 类型定义

自定义数据类型typedef

C语言提供了一个叫做typedef的功能来声明一个已有的数据类型的新名字。比如:

typedef int Length;

使得Length成为int类型的别名

这样,Length这个名字就可以代替int出现在变量定义和参数声明的地方了

Length a, b, len;

Length numbers[10];

typedef

声明新的类型的名字

新的名字是某种类型的别名

改善了程序的可读性

     typedef long int64_t;//重载已有的类型名字,新名字的含义更清晰,具有可移植性

     typedef struct ADate
{
int month;
int day;
int year;
}Date;//简化了复杂的名字 int64_t i = ; Date d = { ,, };

typedef struct
{
int month;
int day;
int year;
}Date;

typedef最后一个单词就是名字

联合

sizeof(union...)=sizeof(每个成员)的最大值

存储

所有的成员共享一个空间

同一时间只有一个成员是有效的

union的大小是其最大的成员

初始化

对第一个成员做初始化

网易云课堂_C语言程序设计进阶_第三周:结构:结构、类型定义、联合的更多相关文章

  1. 网易云课堂_C语言程序设计进阶_第6周:程序结构

    6.1 全局变量 6.2 编译预处理 6.3 大程序结构 6.1 全局变量 全局变量 定义在函数外面的变量是全局变量 全局变量具有全局的生存期和作用域 它们与任何函数都无关 在任何函数内部都可以使用它 ...

  2. 网易云课堂_C语言程序设计进阶_第8周:图形交互程序

    8.2函数指针 8.2函数指针 #include <stdio.h> #include <stdlib.h> void f(int i) { printf("void ...

  3. 网易云课堂_C语言程序设计进阶_第七周:文件:文件访问、格式化输入输出、二进制输入输出

    7.1文件 7.2底层操作 7.1文件 格式化的输入输出 printf %[flags][width][.prec][hIL]type Flag 含义 - 左对齐 + 在前面放+或- (space) ...

  4. 网易云课堂_C语言程序设计进阶_第5周:链表_1逆序输出的数列

    1 逆序输出的数列(10分) 题目内容: 你的程序会读入一系列的正整数,预先不知道正整数的数量,一旦读到-1,就表示输入结束.然后,按照和输入相反的顺序输出所读到的数字,不包括最后标识结束的-1. 输 ...

  5. 网易云课堂_C语言程序设计进阶_第5周:链表

    5.1可变数组 5.2链表 5.1可变数组 Resizable Array Think about a set of functions that provide a mechanism of res ...

  6. 网易云课堂_C语言程序设计进阶_期末考试编程题部分

    1 字符串循环右移(5分) 题目内容: 输入一个字符串和一个非负整数N,要求将字符串循环右移N次. 输入格式: 输入在第1行中给出一个字符串,以'#'表示结束,‘#’不是字符串的一部分,字符串的长度未 ...

  7. 网易云课堂_C语言程序设计进阶_第二周:指针:取地址运算和指针、使用指针、指针与数组、指针与函数、指针与const、指针运算、动态内存分配_2信号报告

    2 信号报告(5分) 题目内容: 无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength)    信号强度即大小. 其中R位于报告第一 ...

  8. 网易云课堂_C语言程序设计进阶_第一周:数据类型:整数类型、浮点类型、枚举类型_1计算分数精确值

    1 计算分数精确值(10分) 题目内容: 由于计算机内部表达方式的限制,浮点运算都有精度问题,为了得到高精度的计算结果,就需要自己设计实现方法. (0,1)之间的任何浮点数都可以表达为两个正整数的商, ...

  9. 网易云课堂_C语言程序设计进阶_第四周:ACL图形库

    创建ACLLib程序 #include"acllib.h" #include<stdio.h> int Setup1() { initWindow(, );//初始化窗 ...

随机推荐

  1. filestream streamreader

    filestream是一个读取文件的stream,其本身也是支持read和write的,负责的对文件的读与写,而streamreader则是建立在对流的基础上的读,同时还有streamwrite ht ...

  2. C# 线程池异步调用

    许多应用程序使用多个线程,但这些线程经常在休眠状态中耗费大量的时间来等待事件发生.其他线程可能进入休眠状态,并且仅定期被唤醒以轮询更改或更新状态信息,然后再次进入休眠状态.为了简化对这些线程的管理,. ...

  3. 图数据库之Pregel

    /* 版权声明:能够随意转载,转载时请务必标明文章原始出处和作者信息 .*/            author: 张俊林 节选自<大数据日知录:架构与算法>十四章.书籍文件夹在此 Pre ...

  4. 有用的HTML+CSS片段

    HTML5页面模板 现在国外很多制作新网站直接使用了HTML5代码,当然我们也得跟上,下面是一个常用的HTML5默认模板,就像你用Dreamweaver新建一个HTML文件时的代码,只不过现在这个是H ...

  5. Apache Lens —— 统计数据分析查询接口

    Lens 提供了一个统一数据分析接口.通过提供一个跨多个数据存储的单一视图来实现数据分析任务切分,同时优化了执行的环境.无缝的集成 Hadoop 实现类似传统数据仓库的功能. 该项目主要特性: 简单元 ...

  6. .net TxetBox控件设置ReadOnly=True后台取值问题

    1.为TxetBox添加onfocus=this.blur()进行模拟 2.通过 Request.From["TextBox"].Trim()取值; 3.后台CS文件设置TextB ...

  7. Inno setup complier将文件添加注册表

    [Registry] Root: HKCR; Subkey:.; ValueType: string; ValueName: ; ValueData:"264file" Root: ...

  8. asp.net 树形控件 $.fn.zTree.init

    在网页中通过jquery脚本来构筑树形控件将是一个不错的选择,比如有一个文本框,当鼠标点击的时候,像弹出一个下拉框一样弹出一个树形控件,这似乎是一个不错的控制.下面主要讲讲这种树形控件的实现.为了能使 ...

  9. JSON 小记

    JSON是在web应用中频繁使用的一种数据结构,在使用过程中经常出现格式错误等等问题,如果能清晰的了解JSON的构成,那将会避免这些错误 英文好的可以查看原文: 地址:http://www.codep ...

  10. HDU 1038 - Biker's Trip Odometer

    算一下路程和速度... #include <iostream> #include <cstdio> using namespace std; const double p=3. ...