C语言学习:C语言关键字(三)

正文共:2290 字 1 图。预计阅读时间: 6 分钟

主要内容:C语言关键字struct和typedf详解.

什么是关键字

关键字是系统定义的,具有特定含义、专门用于特定用途的C语言标识符,也称为保留字。关键字一般为小写字母,在使用时必须遵守一定的语法规则,如果随意使用关键字,可能会出现意想不到的错误,有时程序虽然编译通过,但结果运行不正确,并且很难检查出来。标准C语言共有32个关键字。

昨天我们讲了两个C语言关键字register和static。不明白的可以查看我的前一篇文章,但是有点水分。今天的也讲两个大家比较熟悉的关键字。typedf和struct。先说struct,struct是是属于数据类型。它的含义是结构体型。而typedf是属于存储类型。它的含义是用户自定义类型命名。

typedf-用户自定义类型命名

typedef 关键字是个伟大的缝纫师,擅长做马甲,任何东西穿上这个马甲就立马变样。它可以把狼变成一头羊,也能把羊变成一头狼。甚至还可以把长着翅膀的鸟人变成天使,同样也能把美丽的天使变成鸟人。

历史的误会——也许应该是typerename。

很多人认为typedef 是定义新的数据类型,这可能与这个关键字有关。本来嘛,type 是数据类型的意思;def(ine)是定义的意思,合起来就是定义数据类型啦。不过很遗憾,这种理解是不正确的。也许这个关键字该被替换为“typerename”或是别的词。typedef 的真正意思是给一个已经存在的数据类型(注意:是类型不是变量)取一个别名,而非定义一个新的数据类型。比如:华美绝伦的芍药,就有个别名---“将离”。中国古代男女交往,往往以芍药相赠,表达惜别之情,送芍药就意味着即将分离。所以文人墨客就给芍药取了个意味深长的别名-----“将离”。这个新的名字就表达了那种依依不舍的惜别之情…这样新的名字与原来的名字相比,就更能表达出想要表达的意思。
在实际项目中,为了方便,可能很多数据类型(尤其是结构体之类的自定义数据类型)需要我们重新取一个适用实际情况的别名。这时候typedef 就可以帮助我们。举个例子:就像某某给你取了个小名,这个小名更能代表你的印象,我们就这样约定俗成的习惯了,这就是typedf,简单记住就是取小名,好吧!让别人跟容易记住你。

struct-详解请做好笔记

C语言提供了一种自定义数据类型的机制,利用这种机制可定义出比较复杂的数据类型,如数组、结构体等。这些复杂数据的成员仍然数基本数据类型(整型、字符型、实型、枚举型),所以结构体类型又称为构造数据类型。与数组不同的是,数组中的元素都是相同数据类型的,而结构体类型中的元素可以是不同类型的。可能到现在你还是懵的,举个例子:用结构体来描述一个学生的信息如下:

struct student

{

char name[10];

int age;

long phone;

};

说明:这是一个学生的结构体,结构体名字为student;有三个成员或者元素。分别为name、age、phone。而且都是不同的数据类型,这就是struct的强大之处。可以分装不同的数据类型。其中以分号‘’;‘’作为结束符。

struct 是个神奇的关键字,它将一些相关联的数据打包成一个整体,方便使用。在网络协议、通信控制、嵌入式系统、驱动开发等地方,我们经常要传送的不是简单的字节流(char 型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。经验不足的开发人员往往将所有需要传送的内容依顺序保存在char 型数组中,通过指针偏移的方法传送网络报文等信息。这样做编程复杂,易出错,而且一旦控制方式及通信协议有所变化,程序就要进行非常细致的修改,非常容易出错。这个时候只需要一个结构体就能搞定。平时我们要求函数的参数尽量不多于4 个,如果函数的参数多于4 个使用起来非常容易出错(包括每个参数的意义和顺序都容易弄错),效率也会降低。这个时候,可以用结构体压缩参数个数。

空结构体多大?

结构体所占的内存大小是其成员所占内存之和。这点很容易理解,但是下面的这种情况呢?
struct student
{
}stu;
sizeof(stu)的值是多少呢?
很遗憾,不是0,而是1。为什么呢?你想想,如果我们把struct student 看成一个模子的话,你能造出一个没有任何容积的模子吗?
显然不行。编译器也是如此认为。编译器认为任何一种数据类型都有其大小,用它来定义一个变量能够分配确定大小的空间。既然如此,编译器就理所当然的认为任何一个结构体都是有大小的,哪怕这个结构体为空。那万一结构体真的为空,它的大小为什么值比较合适呢?

假设结构体内只有一个char 型的数据成员,那其大小为1byte(这里先不考虑内存对齐的情况).也就是说非空结构体类型数据最少需要占一个字节的空间,而空结构体类型数据总不能比最小的非空结构体类型数据所占的空间大吧。这就麻烦了,空结构体的大小既不能为0,也不能大于1,怎么办?定义为0.5个byte?但是内存地址的最小单位是1 个byte,0.5 个byte 怎么处理?解决这个问题的最好办法就是折中,编译器理所当然的认为你构造一个结构体数据类型是用来打包一些数据成员的,而最小的数据成员需要1 个byte,编译器为每个结构体类型数据至少预留1 个byte的空间。所以,空结构体的大小就定位1 个byte。


总结

今天的内容还是我们经常遇见的,我认为这样的讲解方式还是比较通俗的,如果还是不懂得可以问,明天继续。

关注我们:源世界Z

源世界为您奉上精品文章。