结构体和共用体

结构体

引入:
在有些时候需要将不同类型的数据组成一个有机的整体,如将学生的姓名,学号,年龄等组织在一起,这时使用结构体是最方便的。

1、结构体类型的声明:
struct 结构体名{
成员列表 //成员也可以是结构体
} ; //注意这里一定要有分号

2、结构体变量的定义:
1、先声明结构体类型,再定义变量;
struct 结构体名{
成员列表;
} ;
结构体类型名 变量名列表;

如:

struct student
{
 char num[5];
 char name[10];
 char sex;
 int age;
 float score;
 };
 struct Student stu1,stu2;

//定义了两个变量 stu1 和 stu2,它们都是 Stu 类型,都由 5 个成员组成
//注意关键字 struct 不能少

2、在定义结构体的同时定义结构体变量;

如;

struct Stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;
//在定义结构体 Stu 的同时,创建了两个结构体变量 stu1 和 stu2

3、方式 3-如果只需要 stu1、stu2 两个变量,后面不需要再使用结构体数据类型,定义其他变量,在定义时也可以不给出结构体名。

如;

struct {
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;
//1. 该结构体数据类型,没有名, 匿名结构体
//2. stu1 和 stu2 就是 该结构体的两个变量

3、结构体变量的赋值

结构体和数组类似,也是一组数据的集合,整体使用没有太大的意义。数组使用下标[ ]获取单个元素,结构体使用点号.获取单个成员。获取结构体成员的一般格式为
结构体变量名.成员名;

代码演示:

struct Stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1;

stu1.name="jieke";
stu1.age=5;
stu1.sex='m';
stu1.group=1;
stu1.score=90;

或者是
struct Stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} ;
struct  student stu1={"jieke",5,'m',1,90};

或者是
struct Student{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1 = {"贾宝玉", 11, 18, 'B', 90.50}, stu2 = { "林黛玉", 12, 16, 'A', 100 };
struct Student stu3 = {"林黛玉 2", 12, 16, 'A', 100 }; //在定义结构体变量时,整体赋值,需要对应

注意下面这种情况不可以
struct Student stu4;
stu4 = {"林黛玉 2", 12, 16, 'A', 100 }; // 这样赋值不可以
stu4.name = "smith"; //这种是可以的

4、成员
基本介绍

  1. 从叫法上看:有些书上称为成员, 有些书说 结构体包含的变量
  2. 成员是结构体的一个组成部分,一般是基本数据类型、也可以是数组、指针、结构体等 。比如我们前面定义
    Cat 结构体 的 int age 就是一个成员。

注意事项和细节说明

  1. 成员声明语法同变量,示例: 数据类型 成员名;
  2. 字段的类型可以为: 基本类型、数组或指针、结构体等
  3. 在创建一个结构体变量后,需要给成员赋值,如果没有赋值就使用可能导致程序异常终止。
  4. 不同结构体变量的成员是独立,互不影响,一个结构体变量的成员 更改,不影响另外一个。

5、使用结构体数组
定义结构体数组的方法和定义结构体变量相仿,只需要指明其为数组即可。
定义的方法和定义结构体变量一样有三种。

案例演示:
1)编写一个 Dog 结构体,包含 name(char[10]),age(int)、weight(double)属性
2) 编写一个 say 函数,返回字符串,方法返回信息中包含所有成员值。
3) 在 main 方法中,创建 Dog 结构体变量,调用 say 函数,将调用结果打印输出。

#include<stdio.h>
#include<stdlib.h>
struct Dog
{

    char *name;
    int age;
    double weight;
};

char *say(struct Dog dog)
{
   //将这个信息放入到一个字符串(字符数组)
    static char info[50];  //函数种拘捕变量通常摇使用静态局部变量,从而避免空间被销毁
   sprintf(info,"name=%s age=%d weight=%.2f", dog.name,dog.age,dog.weight);//sprintf 是个变参函数,定义是:sprintf指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。
   return info;
}
int main()
{

    //定义结构体变量
    struct Dog dog;
    char *info=NULL;
    dog.name = "xiaohua";
    dog.age=2;
    dog.weight=5;
    info=say(dog);
    printf("小狗的信息为:\n%s",info);
    return 0;
}

小狗的信息为:
name=xiaohua age=2 weight=5.00
Process returned 0 (0x0)   execution time : 0.514 s
Press any key to continue.


共用体

基本介绍
1)共用体(Union)属于 构造类型,它可以包含多个类型不同的成员。和结构体非常类似, 但是也有不同的地方.
共用体有时也被称为联合或者联合体, 定义格式为
union 共用体名{
成员列表
};
**2) 结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员
占用同一段内存,该空间的大小以占用最大的成员为准,修改一个成员会影响其余所有成员。 **

在这里插入图片描述

代码演示:

//共用体的定义及初始化
#include<stdio.h>
#include<stdlib.h>

union data  //data 就是一个共用体(内存布局), 包含三个成员, 共享数据空间, 该空间的大小以占用最大的成员为准,这里int型空间最大,所以内存空间为int型
{

    int n;
    char ch;
    short m;
};

void main()
{

    union data a;//定义两个一个 共用体变量 a
    printf("%d, %d\n", sizeof(a), sizeof(union data) ); // 4, 4
    a.n = 0x40;//16 进制
    printf("%d, %c, %d\n", a.n, a.ch, a.m);
    a.ch = '9'; //
    printf("%d, %c, %d\n", a.n, a.ch, a.m);
    a.m = 0x2059;
    printf("%d, %c, %d\n", a.n, a.ch, a.m);
    a.n = 0x3E25AD54;
    printf("%d, %c, %d\n", a.n, a.ch, a.m);
}

输出:
4, 4
64, @, 64
57, 9, 57
8281, Y, 8281
1042656596, T, -21164

Process returned 22 (0x16)   execution time : 0.343 s
Press any key to continue.


在这里插入图片描述
注意:当为成员赋值时从低位开始,比如上图的右边为低位;下图则是上面的是低位。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值