C温故补缺(八):结构体与共用体

结构体与共用体

结构体

是一个可以存储多个不同类型的变量的结构,类似于面对对象中的类(只有成员变量的类).

struct tag { 
    member-list
    member-list 
    member-list  
    ...
} variable-list ;

tag 是结构体标签。

member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。

variable-list 结构变量,定义在结构的末尾,最后一个分号之前,可以指定一个或多个结构变量

一般可以省略tag或variable-list

struct 
{
    int a;
    char b;
    double c;
} s1;

但是这样只能在声明结构时定义变量,之后就不能再定义变量了

struct SIMPLE
{
 int a;
 char b;
 double c;
};

这样才是结构体的最一般的形式,之后再定义结构体变量用struct SIMPLE s2

这两个结构体虽然成员变量相同,但他们的变量不是相同的类型,是不能直接做赋值运算的

结构体和typedef

typedef是用来给数据类型重命名的,但是当和结构体共用时容易混淆

①直接连用

typedef struct simple{
    int a;
    int b;
};
struct simple s1;

这样没什么用

②取别名

typedef struct simple{
    int a;
    int b;
}Smp;
Smp s1;

这样重命名,就可以直接用第二个名字Smp定义变量,而不需加struct

③省略tag

typedef struct{
    int a;
    int b;
}Smp;
Smp s1;

④对已经声明完的结构体重命名

struct simple{
    int a;
    int b;
}s1;
typedef struct simple Smp;

⑤也可以定义结构体指针别名

typedef struct simple{
     int a;
     int b;   
}*sp;
等价于:typedef struct simple *sp;
调用:
sp s1=malloc(sizeof(struct simple));
s1->a=0;

⑥同时定义结构体别名和结构体指针别名(常用,且经常省略tag)

typedef struct{
    int a;
    int b;
}simple,*Spoint;
Spoint s1=malloc(sizeof(simple));
s1->i=3;

这样就可以用simple定义结构体变量,同Spoint定义结构体变量指针

共用体

只是结构上和结构体相似,但共用体更接近于一个变量,这个变量的类型可以是多种的.但是它不能同时有多个类型

如:

union Data{
    int i;
    long f;
    char c[20];
}

用Data定义的变量可以是int,long或char []型的,它的内存空间按最大的变量算

union的作用就是允许同一段内存空间存储不同的数据类型,这就是"共用"的实质

union判断机器大小端(add new)

因为union作为变量时共用相同的内存地址,且同一时间内只能作为一种类型的变量,所以可以根据这个特点设计程序,来查看机器的内存字节排序是大端还是小端。

#include<iostream>

typedef union {
    char c;
    int a;
}Value;

int main(){
    Value value;
    value.a=1;
    std::cout<<(value.c==1);
}

在union中定义两种类型,int或char,并给value变量赋int型,值为1。也就是16进制的0x00000001。因为大小端机器不同,数值1的排序方式可能有两种:00|00|00|01 , 或者 10|00|00|00。而char c和a是相同的起始地址,所以直接取变量c的值,就只有1或0两种情况。由此判断机器是大端还是小端。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值