联合体和结构体

2023-10-18 15:45:37 浏览数 (1)

今天洛谷的运势:

宜:开电脑、写作文(理解为博客) 忌:点外卖、唱歌

竟然宜写博客,所以,直接开始! 今天上完C 的心得! 讲课顺序:按NOI大纲,想拷一份 开始讲之前:哇塞,好高级,联合体,还是新出的,要好好听一下; 讲完:什么拉基,没一点鸟用,还不如结构体,CCF故意搞出来为难我们是吧 就浅浅的讲一下联合体: 联合体和结构体有大大的相同,所以来区分一下好吧:

结构体 struct 结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员”,其描述了一块内存区间的大小及解释意义

cpp

代码语言:javascript复制
struct 结构体名称{
    类型 成员变量1;
    类型 成员变量2;
    ...
    类型 成员变量n;
};

局部代码示例:

cpp

代码语言:javascript复制
struct student  //student 结构体名字
{
    int num;
    char name[20];
    char sex;
    int age;
    double score;
    char addr[30];
};   //别忘记这个分号

num

name

sex

age

score

addr

2字节

20字节

1字节

2字节

4字节

30字节

联合体 union 在进行某些算法的C 语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。 这种几个不同的变量共同占用一段内存的结构,在C 语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。

cpp

代码语言:javascript复制
union 联合体名称{
    类型 成员变量1;
    类型 成员变量2;
    ...
    类型 成员变量n;
};

联合变量的声明 联合变量的声明和结构变量的声明方式相同,也有三种形式。即先定义,再声明;定义同时声明和直接声明。 以perdata类型为例,声明如下:

cpp

代码语言:javascript复制
union perdata
{
    int Class;
    char Office;
};
union perdata a,b;

或者可同时说明为:

cpp

代码语言:javascript复制
union perdata
{
    int Class;
    char Office;
}a,b;

或直接说明为:

cpp

代码语言:javascript复制
union
{
    int Class;
    char Office;
}a,b;

经说明后的a,b变量均为perdata类型。a,b变量的长度应等于 perdata 的成员类型中最长的长度,即等于 Class的长度,共4个字节。从图中可见,a,b变量如赋予整型值时,只使用了4个字节,而赋予字符时,可用1个字节。 一样要记得分号 盲猜你没看懂联合体的,看↓↓↓↓↓↓↓↓↓↓

cpp

代码语言:javascript复制
union 
{
    int a = 65;
    char b;
};

注意:b没有赋任何值 这时进行输出:a = 65,b = ‘a’; 非常的Amzing啊 到底是WHY呢? 因为关联体里面的成员都有关联,所以b就将65转化成了字符

同理: 再进行修改:a = 97; 那b输出就是大写的A了

讲讲各个单位之间的换算:

位(bit)是最小的存储单位 字节(Byte)是电脑能识别的最小单位 1B = 8bit 1KB = 1024B 1MB = 1024KB 1GB = 1024MB 1TB = 1024GB //浅浅的补充一点: 1 PB = 1024 TB 1 YB = 1024 ZB = 1024^20 EB = 1024^30

这里我感觉是最Amzing的 总结来说,就是原来的源程序可以当做另一个程序的头文件(函数) 首先,写一个程序:

cpp

代码语言:javascript复制
#include <bits/stdc  .h>
using namespace std;
void pr()
{
    cout << "Hello World!!!";   
} 

将它存储为《pr.h》

接着开一个《未命名1.cpp》

cpp

代码语言:javascript复制
#include <bits/stdc  .h>
#include"pr.h"
using namespace std;
int main()
{
    pr();
    return 0;
}

接着直接Amzing的输出了Hello World!!! 其实就是调用一个程序

但是,注意事项:

  1. 调用的程序后缀必须为.h
  2. 调用的程序和源程序必须在同一个文件夹中
  3. 源程序中像头文件一样导入,但是要用双引号,即:#include”pr.h”

所以就来了3连翻车: 第一次:

cpp

代码语言:javascript复制
《pr.h》
void pr()
{
    cout << "Hello World!!!";  
} 

报错: cout << “Hello World!!!”; 原因: 为导入头文件和命名空间,非常低级的错误,但是,这个是调用的函数,我一开始也是以为像写函数一样写就行了,没想到还要导入头文件!!!

第二次: 《未命名1.cpp》

cpp

代码语言:javascript复制
#include <bits/stdc  .h>
#include <pr.h>
using namespace std;
int main()
{
    pr();
    return 0;
}

报错: pr(); 原因: 导入应该用双引号

第三次: 代码:

好吧,没代码,代码都是对的 原因:没将两个文件放入一个文件夹中

另外:还讲了关键字等许许多多内容,不再一一叙述 有兴趣者可以上小g同学强力推荐的(总共104集):

OK,直接下课!!!

0 人点赞