一、结构体的访问
1.结构体成员的的直接访问,如下结构体:
struct A{
int a;
long *b;
char c[20];
};
struct A com;
结构体成员通过操作符"."访问,表达式com.a的结果是个数组名,可以把它使用在任何可以使用数组名的地方,com.a[4],将选择一个数组元素。
2、结构体成员的间接访问
struct A *p;
可以使用(*p).a访问结构体成员,但这种形式有点不简洁所以使用操作符"->"来访问结构体成员,箭头操作符对左操作数执行间接访问来获取指针所指向的结构,然后根据右操作数来访问一个成员,p->a。
二、结构体的自引用
struct B{
int a;
struct B b;
int c;
};
这种引用是不合法的,因为b是一个完整的结构,第二个成员又是另一个完整的结构,还包括她自己的成员,这样会循环下去无法及所结构体的大小。
struct B{
int a;
struct B *b;
int c;
};
这种声明是合法的,b现在是一个指针它所占的字节数是已知的,可以计算出结构体的大小,这种自引用是合法的。
三、结构体、指针和成员
typedef struct{
int a;
short b[2];
}Ex1;
typedef struct{
int a;
char b[3];
Ex1 c;
struct Ex1 d;
}Ex2;
Ex2 x={1,"My",{2,{3,4}},0};
Ex2 *p=&x;
如下图来表示此结构:
创建一个指向整型的指针:int *p1;若要使它指向整型成员a,应使用&取得一个指向p->a的指针:p1=&p->a.
访问嵌套的结构体:p->c.a即为访问c结构体中的整形a。
访问指针成员:定义另一结构:Ex y; x.d=&y;则Ex->d->c.b[1]=4;则表示如下图空间:
四、结构体的内存对齐
对齐规则
例:(在此平台上int占4个字节)
虽然A和A1所包含的成员相同,但A占了12个字节,A1占8个字节,所以在声明中对结构体列表的排列,因该让边界要求严格的成员首先出现(数据成员自生长度大的先出现)