结构体

结构体指针

假设cp是一个结构体指针,访问结构体内部成员的两种方式:

struct Complex 
{
    int a;
    char b[10];
    long *p;
};
struct Complex *cp;
  1. (*cp).a;
    //对cp进行间接访问其指向的结构体,然后在访问其成员变量

  2. 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值