C-结构

结构是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。

定义

struct point {
    int x;
    int y;
};
struct point a;
a = {1, 2};
a.x = 3;
a.y = 3;
struct point b;
b.x = 5;
b.y = a.y;

struct {
    int a;
    struct point pt;
} name1, name2;

关键字struct指明这是一个结构
point是结构标记,用于为结构命名,代表了大括号中声明,是可选的
大括号中定义的变量称为成员。
a是一个struct point 类型的变量,并通过复制初始化。
通过结构名.成员引用某个特定结构中的成员
也可以省略结构标记,在大括号后直接声明变量
结构内可以将其他结构作为成员
 
 

操作

作为一个整体复制和赋值
用一个常量成员值列表初始化结构
结构之间不可以进行比较
通过&运算符取地址
访问其成员
 
 

长度

结构的长度不一定等于各成员长度的和
因为不同的对象有不同的对齐要求,因此,结构中可能会出现未命名的空穴(hole)
使用sizeof可以返回正确的对性长度
 
 

结构指针

struct point origin, *pp;
pp = &origin;
(*pp).x = 1;
pp->y = 2;

pp是一个指向struct point类型对象的指针
pp指向origin
pp-> 是 (*pp). 的简写形式
结构成员中不可以包含本结构类型的实例,但是可以包含指向本结构类型的指针。
 
 

类型定义(typeof)

typeof用来建立新的数据类型名
例如:typeof char *String
将String 定义为char类型的指针
 
 

联合

在(不同时刻)保存不同类型和长度的对象的变量
在单块存储区中管理不同类型的数据
实际上,联合就是一个结构,它的所有成员成员相对于基地址的偏移量都为0.
联合的空间要大到足够容纳最“宽”的成员
联合只能用其第一个成员类型的值进行初始化。
每个时刻联合中只能存储一个数据。数据的类型在联合中定义。
读取的类型必须是最近一次存入的类型,程序员负责跟踪当前保存在联合中的类型。

union u_tag {
    int ival;
    float fval;
    char *sval;
} u;

u.ival = 2;

 
 

位字段

“字”(word)是单个的存储单元
位字段是“字”中相邻位的集合

struct {
    unsigned int is_keyword : 1;
    unsigned int is_extern : 1;
    unsigned int is_static : 1;
} flags;

定义了一个变量flags,它包含3个一位的字段。
冒号后的数字表示字段的宽度(用二进制位数表示)

猜你喜欢

转载自blog.csdn.net/qq_31730735/article/details/80729000
C-