C和指针详解------结构和联合

结构的自引用
struct SELF{
    int a;
    struct SELF b;
    int c;
}

这种自引用是非法的。因为成员b是另一个完整的结构体,其内部还将包含它自己的成员b。这样永无止境的重复下去。

struct SELF{
    int a;
    struct SELF *b;
    int c;
}

这样就是合法的了。

作为函数参数的结构

虽然将一个结构变量作为参数是合法的,但是这样往往并不适宜。
传递一个结构体。它的效率很低,因为在C语言中,参数之间的传值调用方式要求把参数的一份拷贝传递给函数。
如果用一个指向结构体的指针则会好的多。指针比真个结构要小很多,所以把它压到堆栈上效率能提高很多。

位段

位段的声明和任何普通的结构成员声明相同,但有两个例外。首先,位段成员必须声明为int、signed int或unsigned int类型。其次成员后面是一个冒号和一个整数。这个整数指定该位段所占用的数目。

struct CHAR{
        unsigned ch      :7;
        unsigned font    :6;
        unsigned size    :19;
};
struct CHAR ch1;

它能够把长度为奇数的数据包装在一起,节省存储空间。当程序需要使用成千上万的这类结构时,这种节省方法就很重要。
另一个使用段位的理由是由于他们可以很方便地访问一个整型值的部分内容。

联合

联合的所有成员引用的是内存中的相同位置。当你想在不同的时刻把不同的东西存储于同一个位置时,就可以使用联合。

union {
        float f;
        int   i;
}fi;

如果成员f被使用,这个字就作为浮点值访问;如果成员I被使用,这个字就作为整型值访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值