《C程序设计》中的指针及用户自己建立数据类型(结构体、共用体等)介绍

1.善于利用指针

指针”就是地址。一个变量的地址称为该变量的“指针”。专门来存放另一变量的地址(指针)的变量,称为指针变量。指针变量的值是地址(指针)。即指针是一个地址,而指针变量是存放地址的变量。这里我觉得叫指针变量让人会感到很玄乎,不如直接叫做“地址变量”。听名字就立马知道了它的意思。
定义一个地址变量的语句为“类型名 *pointer”。pointer前面的星号,表示该变量的类型为地址型变量。&是取地址符号。如“pointer=&a”,其中a是某一变量,pointer是已经定义过的地址变量,这里就表示把a的地址存放在地址变量pointer中。注意:pointer定义时的类型名必须和变量a的类型一致。*pointer=1则表示a=1

2.用户自己建立数据类型

2.1结构体

2.1.1声明结构体类型

C语言允许用户自己建立由不同类型数据组成的组合型数据结构,即结构体
struct Student
{ int num;
char name[20];
char sex;
int age;
struct Data birthday;
float score;
};
这样便声明了一个结构体类型。该结构体类型的名字由一个关键字struct和结构体名Student组合而成(struct Student)。而且一个结构体类型中的成员可以是另一个结构体类型,如上面的成员birthday。

2.1.2定义结构体类型变量

仅声明结构体类型,并没有定义变量,系统将不会分配存储单元。
struct Student student1
这样便定义了个结构体变量student1。其实和int a这样的定义是一致的,只不过把int换成了struct Student。也可以在声明结构体类型的同时定义结构体变量,如下所示:
struct Student
{ int num;
char name[20];
char sex;
int age;
struct Data birthday;
float score;
} student1;
引用结构体变量中成员的值的时候,引用方式为“结构体变量名.成员名”。

2.1.2在结构体中定义位域

“位域”,就是把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。每个域都有个域名,允许在程序中按域名进行操作。一般的语法格式:
struct 位域结构名
{
类型说明符 位域名1:位域长度
类型说明符 位域名2:位域长度
类型说明符 位域名3:位域长度

类型说明符 位域名n:位域长度
} ;
类型说明符可以是unsigned int(无符号基本整型)或int(有符号基本整型)型。位域长度是一个整型常量表达式。一个位段必须存储在同一存储单元中,不能跨两个单元。如第一个单元空间不能容纳下一个位段,则该空间不用。而从下一单元起存放该位段。如给位段赋值大于位段范围的最大值,则只放低位。

2.2共用体

用同一段内存单元存放不同类型的变量,即从同一地址开始存放,使用覆盖技术,后一个数据覆盖前面的数据。称为共用体类型的结构。
union Data
{ int i;
char ch;
float f;
}a,b,c
共用体变量所占的内存长度等于最长的成员的长度。结构体变量所占的内存长度是各成员占的内存长度之和。
共用体变量的引用方式为“共用体变量名.成员名”。如“a.i”。共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元中的值就取代了。在数据处理中,需要对同一段空间安排不同的用途,这时用共用体类型比较方便。

2.3用typedef声明新类型名

除了简单的int,float类型,C程序中会有许多看起来比较复杂的类型:结构体类型,共用体类型、指针类型、枚举类型等等。有些类型形式复杂,难以理解,所以可以用一个简单明了的名字代替。如:
typedef struct
{ int month;
int day;
int year;
} Date;
这里面Data是一个新类型名,代表了一个结构体类型。然后可以把Data当做int来用。像Data birthday便定义了一个结构体类型变量birthday。
这种声明新类型的方式就是:按照定义变量的方式,把变量名换上新类型名,并且在最前面加上“typedef”,就声明了新类型名代表原来的类型。如:
int i > int Count > typedef int Count > Count i
当不同源文件中用到同一类型数据(尤其像数组、指针、结构体、共用体等类型数据)时,常用typedef声明一些数据类型。可以把所有的typedef名称声明单独放在一个头文件中,然后在需要用到它们的文件中用#include指令把它们包含到文件中。这样编程者就不需要在各文件中自己定义typedef名称了。

猜你喜欢

转载自blog.csdn.net/qq_39529052/article/details/105805842