typedef

  虽然我们知道使用struct这个关键字定义一个结构类型,然后可以使用该结构类型定义变量。但是每次要使用的时候都需要带着struct这个关键字,那么如何摆脱这个关键字哪?C语言提供了一个叫做typedef的功能来声明一个已有的数据类型的新名字,typedef也是个关键字,比如:

typedef int Length;

  意思是Length是int类型的别名,可以代表int。在程序的变量定义或者参数声明时,如果出现Lenght就是表示int:

Length a,b,len;
Length numbers[10]; //相当于int numbers[10]

  再比如:

typedef long int64_t;  //typedef后面跟着两个东西,一个是原来的实际的数据类型,第二个东西是你给起的新名字
typedef struct ADate{
int month;
int day;
int year;
}Date; //所以这个Date是新名字,typedef和Date之间的所有的东西是原来的数据类型,这块原来的类型是struct int64_t i=10000000000; //相当于 long i=100000000000;
Date d = {3,29,2017}; //相当于struct ADate d = {3,29,2017};

  所以typedef的作用是声明一个数据类型的新名字,新名字相当于该数据类型的别名,改善了程序的可读性。

  再看下面的代码,是怎么回事哪:

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

  如果没有typedef,那么是使用一个没用名字的结构定义了一个变量Date,那么加上typedef,实际意思是将没用名字的结构定义为Date,它有了一个新的名字,至于这个结构叫什么名字就无所谓了。

  typedef有的时候你会看到很复杂,但是只要知道最后一个单词是新名字。比如:

typedef *char[10] Strings;//Strings是10个字符串的数组的类型
typedef struct node{
int date;
struct node *next;
}aNode; //aNode是新的名字

联合

  和struct非常相似的一个东西是union,union的用法和struct是非常相似的:

union AnElt{
int i;
char c;
}elt1,elt2; elt1.i=4;
elt2.a='a';
elt2.i=0xDEADBEEF; //将elt2.a中的值给冲刷掉

  和struct不同的是,struct中的两个成员是分开的,是可以随意使用的。但是对于union来说,这两个成员占据了同一个空间,即使有3,4个成员,每个成员占据的空间都是一份,所以称为联合,大家联合起来使用同一个空间,怎么使用?如果第一个成员使用了,第二个就会把第一个给覆盖掉,但是第一个成员的值还在,呃呃呃呃这是什么东西?实际上联合在存储的时候,所有成员共享一个空间,同一时间只有一个成员是有效的,union的空间是其最大成员的大小。对联合进行初始化的时候,只需对第一个成员做初始化。

  下面看union的常用应用场合:

#include <stdio.h>
typedef union{
int i;
char ch[sizeof(int)];
}CHI; int main(int argc,char const argv[]){
CHI chi;
int i;
chi.i=1234;
for (i=0;i<sizeof(int);i++)
printf("%02hhX",chi.ch[i]); //%02hhX是格式符,这部分在文件章节详细讲解,大概的意思是输出16进制,并且这是一个字节,不要给我们做扩展,显示两个16进制数字的方式,如果前面不到10就补充0, printf("\n");
return 0;
}

  使用typedef将一个联合重命名为CHI,在主函数中定义CHI类型的变量chi,然后chi.i赋值1234,那么1234这个10进制数据化为16进制为:0x04D2,因为union中每个成员共用一个空间,所以chi.ch这个数组中的内容也是0x04D2,该数组共有sizeof(int)个,也就是4个,那么chi.ch[0]=00,chi.ch[1]=00,chi.ch[2]=04,chi.ch[3]=D2。为了验证我们的想法,编译运行程序结果是:

FFD2040000

--------------------------------
Process exited after 0.008268 seconds with return value 0
请按任意键继续. . .

  和我们想的有一点不一样,顺序是反过来的,chi.ch[0]=D2,chi.ch[1]=04,chi.ch[2]=00,chi.ch[3]=00,这主要因为在x86计算机中,数据的存储是小端存储方式,低位数据在高地址内存空间,高位数据在低地址内存空间。

  上述就是union常用场合,通过union得到一个整数内部的各个字节,同样通过这种方式可以得到double内部的各个字节等,这是一个有趣的工具,比如在做文件操作的时候,或者将一个数以2进制的形式写入到一个文件中的时候就需要用到。

听翁恺老师mooc笔记(13)--类型定义和联合的更多相关文章

  1. 听翁恺老师mooc笔记(14)--格式化的输入与输出

    关于C语言如何做文件和底层操作: 文件操作,从根本上说,和C语言无关.这部分的内容,是教你如何使用C语言的标准库所提供的一系列函数来操作文件,最基本的最原始的文件操作.你需要理解,我们在这部分所学习的 ...

  2. 听翁恺老师mooc笔记(12)--结构中的结构

    结构数组: 和C语言中的int,double一样,一旦我们做出一个结构类型,就可以定义这个结构类型的变量,也可以定义这个结构类型的数组.比如下面这个例子: struct date dates[100] ...

  3. 听翁恺老师mooc笔记(11)--结构和函数

    结构作为函数参数: 声明了一个结构就有了一种自定义的数据类型,这个数据类型和int.float.double一样,int等基本类型可以作为函数的参数,那么这种个自定义的结构类型也应该可以作为函数参数, ...

  4. 听翁恺老师mooc笔记(10)--结构

    定义结构: 在程序里,如果想要表达一个数据就需要一个变量,而每个变量又都需要一个类型,之前学过C语言中有int.double.float.char等这些基础类型,还有指针.数组等.如果你要表达的数据比 ...

  5. 听翁恺老师mooc笔记(9)--枚举

    枚举类型的定义 用符号而不是具体的数字来表示程序中的数字,这么表示的好处是可读性,当别人看你的程序,看到的是单词,很容易理解这些数字背后的含义,那么用什么符号来表示名字哪?需要const int常量的 ...

  6. 听翁恺老师mooc笔记(8)--字符串2

    字符串的赋值 字符串的输入与输出 对C语言的基础类型,比如int.double等类型,scanf.printf有专门的格式转换,而对字符串,scanf.printf使用%s格式字符进行输入与输出.当使 ...

  7. 听翁恺老师mooc笔记(6)--指针运算

    指针值加1就是将指针值加上sizeof(指针所指变量的类型) 1+1=2,那么指针加1是加上了1这个数字吗?试一下,在代码中定义了char数组,char也是整数,数组名是ac,ac中有10个元素,0- ...

  8. 听翁恺老师mooc笔记(5)--指针与数组

    如果我们通过函数的参数将一个数组传递到参数中去,那么在函数里接收到的是什么东西呢?我们知道如果传递一个普通变量,那么参数接收到的是值,如果传递一个指针变量,参数接收到的也是值,只不过这时的值是地址.那 ...

  9. 听翁恺老师mooc笔记(4)--指针的应用场景

    指针应用场景一:交换两个变量的值 在学习函数时,交换两个数的值,做一个swap函数,传递值进去,也可以将两个值交换过来,没问题,可是离开swap就没有用了,为什么?因为传进去的是两个值. #inclu ...

随机推荐

  1. Django学习-17-CSRF

    CSRF(跨站请求伪造)         用户请求获取数据时,加入一段加密字符串,只有服务器能反解.         XSS(跨站脚本攻击),JS脚本在网站中运行,如果获取到用户Cookie,可以利用 ...

  2. IOS开发之App被拒原因

    新手入门,简单记录一下Ipa提交给苹果公司后,有可能会被驳回的原因,欢迎补充和纠正! 原因: 1.ipa功能缺陷,譬如不能正常登陆.界面打不开.支付调不起等测试过程中未发现的Bug,实在是不应该!!! ...

  3. 【ZJOI2008】树的统计(树链剖分)

    题面 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II ...

  4. 推荐一款有趣的APP-种子习惯

    在女朋友的影响下接触到了种子习惯的app,一开始不觉得它有多大魅力,只知道它有契约的功能,有很多人分享自己的习惯,记录生活中的点滴. 毕业回家的寒假,家里比较冷,每天起床都需要莫大的勇气,挣扎半天最终 ...

  5. 8Manage:聚焦研发企业利器——研发项目管理

    [导读]研发是企业保持核心竞争力的基石.那么对于研发企业来说,如何计划研发项目目标.保障项目的稳定运行,如何分配人才.资源,把控项目成本呢?这些一系列问题摆在管理者面前!引入8Manage研发项目管理 ...

  6. error:org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException

    问题:调用的方法在一个接口类中,但我并没有注入那个被调用的类 解决:在UserEntity前加上@Autowired @Controller public class MainController { ...

  7. NOI2001炮兵阵地

    题目传送门 PS:本道题目建议在对状压dp有一定了解的基础下学习,如有不懂可以先去学一下状压dp入门 题目大意:给你n*m个格子,有些格子可以用来部署军队,用P表示,有些则不能,用H表示,如果在一个格 ...

  8. JVM堆外内存随笔

    一 JVM堆外内存 1)java与io(file,socket)的操作都需要堆外内存与jvm内存进行互相拷贝,因为操作系统是不懂jvm的内存结构的(jvm的内存结构是自管理的),所以堆外内存存放的是操 ...

  9. SpringMVC中的适配器(适配者模式)

    此处采用了适配器模式, 由于Controller的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用Controller方法,需要在代码中写成如下形式: if(mappedHandl ...

  10. this->的作用

    参考:https://www.zhihu.com/question/23324143 1.来源: 当年没有C++编译器,只能通过C++转成C语言才编译.而C++中的class就被翻译C语言的struc ...