typedef
typedef 类型-声明 同义字;
Typedef关键字定义由其指定的 类型-声明 的同义字。类型-声明 中的声明标识符成为类型的另一个名称(即别名),别名的作用是在命名属于该类型的实例时替换类型名称。同样可以在函数定义中使用typedef指派符。
Typedef 引入了一个名称,该名称在 Typedef声明范围内的decl-specifiers部分中声明,以作为类型的同义字。与class、 struct、 union 和 enum等声明符相比,typedef 声明符并未引入新的类型,而是引入了已有类型的新的名称。
Example
//
使用
typedef
关键字的例子
typedef unsigned long ulong;
ulong ul; //
相当于
"unsigned long ul;"
typedef struct mystructtag
{
int i;
float f;
char c;
} mystruct;
mystruct ms; //
相当于
"struct mystructtag ms;"
typedef int (*funcptr)(); // funcptr
是
"
指向返回值为
//
整型的函数的指针
"
的同义字
funcptr table[10]; //
相当于
"int (*table[10])();"
struct
struct [标签] { 成员-列表 } [声明符];
[struct] 标签 声明符;
Struct关键字的作用是定义一种结构体类型和(或者)一种结构体类型变量。更多信息请查看匿名结构体和结构体中的可变数组部分。
结构体类型是一种用户自定义复合类型。它由不同类型的“域”或“成员”组成。
在C++中,结构体和类相同,但默认情况下结构体的成员是公有的。
使用结构体
在C语言中,必须明确地使用struct关键字声明一种结构体。在C++中,一旦定义了类型就不需要再使用struct关键字了。
声明结构体类型变量时,结构体类型成员置于一对花括号中,成员之间通过分号分隔。
Example 1
struct PERSON //
声明
PERSON
结构体类型
{
int age; //
声明成员类型
long ss;
float weight;
char name[25];
} family_member; //
声明
PERSON
类型对象
struct PERSON sister; // C
风格声明结构体体
PERSON brother; // C++
风格声明结构体体
sister.age = 13; //
为结构体成员赋值
brother.age = 7;
可以在声明结构体变量时将变量初始化,初始化的值放在一对花括号中。
Example 2
struct POINT //
声明
POINT
结构体
{
int x; //
定义
X
和
Y
两个成员
int y;
} spot = { 20, 40 }; //
变量
spot
中成员的值
// x = 20, y = 40
struct POINT there; //
变量
there
为
POINT
类型
struct CELL //
声明
CELL
字节域
{
unsigned character : 8; // 00000000 ????????
unsigned foreground : 3; // 00000??? 00000000
unsigned intensity : 1; // 0000?000 00000000
unsigned background : 3; // 0???0000 00000000
unsigned blink : 1; // ?0000000 00000000
} screen[25][80]; //
字节域数组
匿名结构体
Microsoft 细节 —>
Microsoft C 的一个扩展就是允许用户在一个结构体中声明另一个结构体,声明的这个结构体可以不对其进行命名。这种被嵌套的结构体就称为匿名结构体。C++并不允许匿名结构体。
可以象访问包含匿名结构体的结构体中的成员一样的方式访问匿名结构体中的成员。
Microsoft 细节结束
Example
//
匿名结构体示例
struct phone
{
int areacode;
long number;
};
struct person
{
char name[30];
char sex;
int age;
int weight;
struct phone; //
匿名结构体
;
不需名称
} Jim;
Jim.number = 1234567;
结构体中的可变数组
Microsoft 细节 —>
Microsoft扩展允许C或C++结构体或类的最后一个成员可以是一个可变大小的数组。这种数组称为可变数组。结构体最后的可变数组允许增加可变长度的字符串或其他数组,因此避免了运行时执行指针销毁的开销。
struct PERSON
{
unsigned number;
char name[]; //
可变数组
};
如果对这个结构体使用sizeof操作符,最后的数组成员大小考虑为0。该数组的大小为2字节,这个大小也是未指定成员的大小。要获得PERSON类型变量的大小则需要单独获得其中数组的大小。
结构体的大小根据数组大小获得分配的总大小。分配空间后,数组则被拷贝到结构体的数组成员中。
struct PERSON *ptr;
char who[40];
printf( "Enter name: " );
gets( who );
//
为结构体,名称和终止
NULL
分配空间
ptr = malloc( sizeof( struct PERSON ) + strlen( who ) + 1 );
//
拷贝字符串到
name
成员
strcpy( ptr->name, who );
一旦初始化结构体中的可变数组,sizeof操作符返回的大小将不含数组的大小。
可以初始化包含可变数组的结构体,但不能初始化结构体数组。
struct PERSON me = { 6, "Me" }; //
符合逻辑
struct PERSON you = { 7, "You" };
struct PERSON us[2] = { { 8, "Them" }, //
不正确
{ 9, "We" } };
字符数组以字符串初始化后将获得终止
NULL
的空间;以多个独立的字符初始化的字符数组(例如:
{'a', 'b', 'c'})则不会有终止
NULL
。
包含可变数组的结构可出现在另一个结构体中,就象作为包含它的结构体的最后一个成员的声明一样。包含可变数组的类或结构体不能有直接或间接的虚基础(virtual bases)。
相关信息, 请查看 volatile 和 #define部分。
Microsoft 细节结束