结构体指针
假设cp是一个结构体指针,访问结构体内部成员的两种方式:
struct Complex
{
int a;
char b[10];
long *p;
};
struct Complex *cp;
(*cp).a;
//对cp进行间接访问其指向的结构体,然后在访问其成员变量cp->a;
//不涉及间接访问
结构体的自引用
错误例子:
struct struct1
{
int a;
struct struct1 stru;
}
正确例子:
struct struct1
{
int a;
struct struct1 *stru;
}
结构体的内存分配
这里要设计一个边界对齐的问题:
假设在某个机器上,int型的字节数为4,char型的字节数为1,且他的其实存储位置必须能够被4整除,那么假如一个结构体的定义如下:
struct Example
{
char a;
int b;
}
那么在内存管理时,由于考虑到边界对齐,变量的起始存储位置必须在可以被4整除的内存上,则a之后会有3个字节的空间空出来,造成浪费。
节省内存的定义方式为:
struct Example
{
int a;
char b;
}
结构体作为函数参数
∵ C语言的参数传递调用方式为:把参数的一份拷贝传递给函数
∴ 把结构体指针作为参数传递给函数要比把整个结构体传递给参数的效率要高得多
PS:把变量声明为寄存器变量(register,在函数开头需要一条额外的指令),在对于结构体指针的间接访问>3次时(考虑到指令的原因),可以大大提高结构体指针的传值效率。
为了避免函数对于结构体变量的修改,可以使用const修饰
综合得出的传值方式:
void print_xxx(register struct_name const *cp)