正文

C语言笔记 22005-02-15 22:54:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/book/214.html

分享到:

2. 数据类型与存储类型
C语言中,变量和函数有两个属性,数据类型和存储类别。

变量声明和定义的格式为:
[存储类别] 数据类型 变量名;  如:
extern unsigned char g_lumQuantTable[DCT_SIZE][DCT_SIZE];

函数声明的格式为:
[存储类别] 数据类型 函数名(形参列表...);  如:
extern void DCT_8x8(double dct[][DCT_SIZE], const double pic[][DCT_SIZE]);

函数定义的格式为:
[存储类别] 数据类型 函数名(形参列表...) {
    ...
}
如:
static void DCT_AAN(double dct[], const double pic[]) {
    ...
}

变量的数据类型有三大类:基本类型、派生类型和指针类型。

2.1 基本类型
包括字节型(char)、整型(int)和浮点型(float/double)。
定义基本类型变量时,可以使用符号属性signed、unsigned(对于char、int),和长度属性short、long(对于int、double)对变量的取值区间和精度进行说明。

下面列举了Dev-C++下基本类型所占位数和取值范围:
符号属性     长度属性     基本型     所占位数     取值范围       格式符
[signed]      --          char         8         -2^7 ~ 2^7-1      %c
unsigned      --          char         8         0 ~ 2^8-1         %c

[signed]      short       [int]        16        -2^15 ~ 2^15-1    %d
unsigned      short       [int]        16        0 ~ 2^16-1        %u
[signed]      --          int          32        -2^31 ~ 2^31-1    %d
unsigned      --          int          32        0 ~ 2^32-1        %u
[signed]      long        [int]        32        -2^31 ~ 2^31-1    %ld
unsigned      long        [int]        32        0 ~ 2^32-1        %lu
[signed]      long long   [int]        64        -2^63 ~ 2^63-1    --
unsigned      long long   [int]        64        0 ~ 2^64-1        --

--            --          float        32    +/- 10^-38 ~ 10^38    %f
--            --          double       64    +/- 10^-308 ~ 10^308  %lf
--            long        double       96                          --

几点说明:
1 int的长度,是与short一致或是与long一致,与编译器有关。
2 有些编译器可以选择float的长度,是否与double一致。
3 IEEE标准浮点数中,long double型的长度为80位,VC中即按此标准。
4 VC中没有long long类型,但可以使用__int64类型。
5 字符型、整型数据可以使用%d、%o(8进制)或%x(16进制)方式输入输出。
6 浮点型数据输入时可使用%e(同%f);输出时也可使用%e(指数表示)或%g(自动选择)。
7 标准C中,unsigned型数据,输出时使用%u,输入时使用%d或%o、%x。
8 long long、long double型数据不能直接进行输入输出。

2.2 派生类型
包括数组、结构体(struct)、共用体(union)和枚举类型(enum)。其中前三种也合称为构造类型。
除数组类型以外,后三种类型在定义变量(实例)之前,均需要向编译器说明该类型的具体信息,struct和union需要说明组成成员,而enum则需要明确取值值域和枚举元素。

2.2.1 数组类型
是一种简单聚合构造方式,在变量名后加“[ ]”即可。数组中每个元素可以是任何基本类型、派生类型、指针类型,甚至也可以是数组类型,这时定义的也就是多维数组。
例如:unsigned char g_compQuantTable[2][DCT_SIZE*DCT_SIZE];
在g_compQuantTable[DCT_SIZE*DCT_SIZE]的基础上,在数组名g_compQuantTable后再加“[2]”,就定义了一个二维数组,它由两个长度为DCT_SIZE*DCT_SIZE的unsigned char一维数组型元素组成。

2.2.2 结构体(struct)
结构是一种复杂聚合构造方式,通常用作:

(1) 将一般作为一个整体来使用的数据元素结合到一起,如:
typedef struct {
     DWORD buffer;
    BYTE ptr;
    FILE *fp;
}StrmType;

(2) 从函数中返回多个数据元素,如利用输出参数回传:
int LoadBMPHeader(struct BMP_Header *image, const char *fileName) {
    ...
}
或者返回结构体实例:
TokenType Operate(TokenType a, TokenType theta, TokenType b) {
    TokenType r;
    ...
    return r;
}

(3) 构造链式数据结构,如二叉树节点的定义:
typedef struct HuffNode {
    BYTE val;
    struct HuffNode *left;
    struct HuffNode *right;
}HuffNode, *HuffTree;

(4) 映射数据在硬件设备、网络链接和存储介质上的组织方式,如BMP文件头:
typedef struct tagBITMAPFILEHEADER {
    WORD    bfType;
    DWORD    bfSize;
    WORD    bfReserved1;
    WORD    bfReserved2;
    DWORD    bfOffBits;
} BITMAPFILEHEADER
结构内字段的次序依赖于所处的架构和所用的编译器,结构内各元素的表达也依赖于架构和操作系统。即使是基本类型的数据,比如整型,字节的存储方式也会有所不同。因此,这种应用天生不可移植。

(5) 实现抽象数据类型

(6) 以面向对象的方式编程
将数据元素和函数指针聚合成结构,模拟类的字段和方法,创建与类相仿的实体。由于“对象”可以使用不同的“方法”(函数指针)来初始化,并通过相同的界面来使用(通过同一结构成员名调用),这种技术实现了面向对象语言中的虚方法(virtual method)和多态编程(polymorphic programming)。

2.2.3 共用体(union)
与聚合构造不同,共用体是一种联合构造类型,多个成员共享同一存储区域。通常用于:

(1) 有效地利用存储空间

(2) 实现多态(polymorphism),例如表达式分析中记号(token)的定义:
typedef enum {
        OPTR,FUNC,OPND
}TagType;
typedef union {
        char optr;
        FuncType func;
        double opnd;
}DataType;
typedef struct {
        TagType tag;
        DataType data;
}TokenType;
每个记号只能是操作符、函数或操作数,利用标记成员进行区分和识别。
同一对象(结构)用于代表不同的类型,这些不同类型的数据都存储在独立的共用体成员中,这种方法实现了面向对象语言中的多态数据(polymorphic data)。

(3) 使用不同的内部表达方式对数据进行访问,例如为了方便地对WORD的每位进行访问而定义如下共用体:
typedef union {
        WORD val;
        struct {
                WORD bit0:  1;    WORD bit1:  1;
                WORD bit2:  1;    WORD bit3:  1;
                WORD bit4:  1;    WORD bit5:  1;
                WORD bit6:  1;    WORD bit7:  1;
                WORD bit8:  1;    WORD bit9:  1;
                WORD bit10: 1;    WORD bit11: 1;
                WORD bit12: 1;    WORD bit13: 1;
                WORD bit14: 1;    WORD bit15: 1;
        }bits;
}WORD_REG_TYPE;

2.2.4 枚举类型(enum)
枚举类型不是一种构造类型, 因为它不能再分解为任何类型。因此,C语言教科书上将它归为基本数据类型。
从本质上来看,它可以算作是整型的一种变体。
这里暂且将它看作派生类型,是因为在定义枚举变量前,需要向编译器提供额外的信息,这点与结构体、共用体相似,而且类型声明的结构也极为相象。

阅读(4925) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册