C/C++的Struct和Union简介

一,结构体的概念和定义

1,结构体的定义

struct 结构体名

{

 数据类型 成员名1;

 数据类型 成员名1;

 ...

};

这里数据类型可以是复合类型,例如又是一个结构体类型,即嵌套;

 

2,结构体变量的定义

struct 结构体名 变量名1,变量名2,,,变量名n;

或:

struct 结构体名

{

 数据类型 成员名1;

 数据类型 成员名1;

 ...

}结构体变量1,结构体变量2;

或:

struct

{

 数据类型 成员名1;

 数据类型 成员名1;

 ...

}结构体变量1,结构体变量2;

三种方式,第三种方式的话,每次要定义这个类型的结构体变量都要重复的写这

一段代码;

 

其实定义了结构体后,struct 结构体名就是一种新的类型,上述语句就像声明

变量一样;

 

3,结构体变量的引用

只能对结构体变量中的各个成员分别输出,不能对一个结构体变量作为一个整体

输出;

嵌套的结构体类型的引用:

结构体变量名.结构体类型成员名.内嵌结构体的成员名;

 

4,结构体变量的初始化

struct 结构体名 变量名 = {初始化数据};

或者在定义的时候就初始化:

struct 结构体名

{

 数据类型 成员名1;

 数据类型 成员名1;

 ...

}变量名 = {初始化数据};

 

二,结构体数组

1,结构体数组的定义举例

struct stu

{

 int stu_nu;

 char name[20];

 float score;

};

struct stu student[5];

或者:

struct stu

{

 int stu_nu;

 char name[20];

 float score;

}student[5];

或者:

struct

{

 int stu_nu;

 char name[20];

 float score;

}student[5];

跟定义结构体变量的三种形式是一样的,只不过这里每次定义的结构体变量是一

个数组;每一个student[i]都是struct stu类型的;

 

2,结构体数组的初始化和引用

略;

 

三,结构体与指针

1,指向结构体的指针的定义,同上,也是三种形式;

struct employees employee1,*p1;

或者:

struct employees

{

 ...

}employee1,*p1;

或者:

struct

{

 ...

}employee1,*p1;

然后可进行如下操作:p1 = &employee1;此时p1指向首地址;

 

2,用结构体变量指针来引用结构体成员的两种操作:

(*结构体变量的指针名).成员名;

如:(*p1).name;括号不能省略,.的优先级是最高的;

或:

结构体变量的指针名->成员名;

如:p1->name;

注意.和->的优先级是最高的;

employee1.name;

(*p1).name;

p1->name;

是等价的;

 

3,结构体数组与指针

struct stu

{

 int stu_nu;

 char name[20];

 float score;

}student[5],*p;

此时可以

(1)把数组student的起始地址赋给p:

p = student;此时p指向student[0];

(2)也可把student的其他元素的地址赋给p

p = &student[3];

(3)利用指针移动如p++使p指向结构体数组的不同元素;

 

四,结构体作为函数参数

1,结构体变量作为函数参数

2,指向结构体变量的指针作为函数参数

略,在后续文章里将给出一个例子;

 

五,共用体(联合体)

它可以表示几种不同类型的变量共用同一起始地址的内存单元,其定义形式,变

量说明,引用方式都类似于结构体,本质差别在于两者的存储方式不一样:结构

体变量的各个成员变量在存储时,各占不同起始地址的内存单元,而共用体的各个成员在存储时,共用同一起始地址的存储单元;

1,共用体的定义

三种方式和结构体一样

union data

{

int i;

float f;

char ch;

};

union data a,b,c;

或者:

union data

{

int i;

float f;

char ch;

}a,b,c;

或者:

union

{

int i;

float f;

char ch;

}a,b,c;

 

在类型定义时,系统并未给共用体分配具体的存储空间,只有当定义了这种共用

体类型的变量时,系统才为这种共用体类型的变量分配空间;一个共用空间的大

小相同,大小为成员项中占空间最大的那一个;

 

2,共用体变量的引用

union data a,*p;

其引用形式:

a.i;a.f;a.ch;或者

p = &a;p->=5;p->=4.3;p->='A';

由共用体的存储特性,知道&a,&a.i,&a.f,&a.ch都是同一个值;

C规定,不能把共用体变量作为函数参数或函数返回类型;

在某一时刻,共用体的存储空间只能存储一个成员的数据,在给不同的成员数据

赋值时,要注意最后引用的时候存储的是哪一个成员变量;

如下面的赋值就是不对的:

union

{

int i;

float f;

char ch;

}a = {5,4.3,'A'};一次只能给一个成员赋值,且共用体空间保存的是最后的那个成员的值;

另外,共用体也能嵌套,也可定义共用体数组,在这里不再详述,形式和结构体一样;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值