网易云课堂_C语言程序设计进阶_第三周:结构:结构、类型定义、联合
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语言程序设计进阶_第三周:结构:结构、类型定义、联合的更多相关文章
- 网易云课堂_C语言程序设计进阶_第6周:程序结构
6.1 全局变量 6.2 编译预处理 6.3 大程序结构 6.1 全局变量 全局变量 定义在函数外面的变量是全局变量 全局变量具有全局的生存期和作用域 它们与任何函数都无关 在任何函数内部都可以使用它 ...
- 网易云课堂_C语言程序设计进阶_第8周:图形交互程序
8.2函数指针 8.2函数指针 #include <stdio.h> #include <stdlib.h> void f(int i) { printf("void ...
- 网易云课堂_C语言程序设计进阶_第七周:文件:文件访问、格式化输入输出、二进制输入输出
7.1文件 7.2底层操作 7.1文件 格式化的输入输出 printf %[flags][width][.prec][hIL]type Flag 含义 - 左对齐 + 在前面放+或- (space) ...
- 网易云课堂_C语言程序设计进阶_第5周:链表_1逆序输出的数列
1 逆序输出的数列(10分) 题目内容: 你的程序会读入一系列的正整数,预先不知道正整数的数量,一旦读到-1,就表示输入结束.然后,按照和输入相反的顺序输出所读到的数字,不包括最后标识结束的-1. 输 ...
- 网易云课堂_C语言程序设计进阶_第5周:链表
5.1可变数组 5.2链表 5.1可变数组 Resizable Array Think about a set of functions that provide a mechanism of res ...
- 网易云课堂_C语言程序设计进阶_期末考试编程题部分
1 字符串循环右移(5分) 题目内容: 输入一个字符串和一个非负整数N,要求将字符串循环右移N次. 输入格式: 输入在第1行中给出一个字符串,以'#'表示结束,‘#’不是字符串的一部分,字符串的长度未 ...
- 网易云课堂_C语言程序设计进阶_第二周:指针:取地址运算和指针、使用指针、指针与数组、指针与函数、指针与const、指针运算、动态内存分配_2信号报告
2 信号报告(5分) 题目内容: 无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength) 信号强度即大小. 其中R位于报告第一 ...
- 网易云课堂_C语言程序设计进阶_第一周:数据类型:整数类型、浮点类型、枚举类型_1计算分数精确值
1 计算分数精确值(10分) 题目内容: 由于计算机内部表达方式的限制,浮点运算都有精度问题,为了得到高精度的计算结果,就需要自己设计实现方法. (0,1)之间的任何浮点数都可以表达为两个正整数的商, ...
- 网易云课堂_C语言程序设计进阶_第四周:ACL图形库
创建ACLLib程序 #include"acllib.h" #include<stdio.h> int Setup1() { initWindow(, );//初始化窗 ...
随机推荐
- 一个简单的倒计时js插件
接收的参数end是必须传的,格式是/分隔的日期字符串,start是可选的,不传就是从现在开始倒计时,callback也是可选的,到倒计时接收时执行自定义的函数. countdown({ 'end':' ...
- UI产品设计流程中的14个要点
http://www.sj33.cn/digital/wyll/201404/38318.html 自从我在 Dribbble 上贴了一幅我的产品设计成果,受到了大家伙热烈的反馈,对此我深受鼓励,我决 ...
- Hadoop 3、Hadoop 分布式存储系统 HDFS
HDFS是Hadoop Distribute File System 的简称,也就是Hadoop的一个分布式文件系统. 一.HDFS的优缺点 1.HDFS优点: a.高容错性 .数据保存多个副本 .数 ...
- #include <boost/regex.hpp>
boost C++的正则表达式库boost.regex可以应用正则表达式于C++.正则表达式大大减轻了搜索特定模式字符串的负担,在很多语言中都是强大的功能. boost.regex库中两个最重要的类是 ...
- STL set接口中使用结构体类型
需要在结构体中重载'<'运算符,下面是我写的一个例子: #include<iostream> #include<set> using namespace std; str ...
- C#接口的使用【转】
我们定义一个接口public interface IBark{ void Bark();}再定义一个类,继承于IBark,并且必需实现其中的Bark()方法public class Dog:IBa ...
- Cocos2d-x 3.1.1 Lua演示样例 ActionEaseTest(动作)
Cocos2d-x Lua演示样例 ActionEaseTest(动作) 本篇博客介绍Cocos2d-x中的动作,Cocos2d-x为我们提供了丰富的动作接口,以下笔者就具体介绍一下: 本系列 ...
- as3 页游中,新手指导中,屏蔽所有交互对象,但除了指定交互对象可用的方法【转http://blog.csdn.net/linjf520/article/details/9450945】
package { import flash.display.InteractiveObject; import flash.display.Stage; import flash.events.Mo ...
- word2vec配置到使用
(1)首先下载word2vec,地址:https://code.google.com/p/word2vec/,可能下载的时候有问题,google上不去,那么可以从csdn上面下载. 解压后目录如下: ...
- virtualBox 安装CentOS 全屏
在VirtualBox里安装CentOS系统,会遇到“增强工具”无法正常安装,主要的原因是出在Kernel 库找不到. 错误提示如下: 通过查看日志文件: cat /var/log/vboxadd-i ...