当前位置: 首页 > news >正文

【每日C/C++问题】

一、 结构体和联合体有什么区别?能否在声明过程当中缺省名字?(需要写清楚使用方法)

结构体的各个成员占用不同的内存空间,总大小是所有成员大小之和(结构体字节对齐

typedef struct Student {int a;char b;short c;char d;
} stu;
对齐规则:找成员中最大的类型 用他作为字节对齐数求出来的结果一定是对其数的整数倍整数倍的地址对齐
a
bxc
dxxx

        该结构体成员中的最大类型为 int 类型 4 字节,所以按 4 字节对齐,c 为 short 类型占 2 字节由于按整数倍的地址对齐所以不可以紧挨着 b 放,需要在前面补一位再放 c ,d 为 char 类型占 1 字节需要按 4 字节对齐,所以需要在后面补 3 位。 最后求得该结构体所占内存大小为 12 字节。

联合体的所有成员共享一块内存空间,联合体的大小等于其最大成员的大小

typedef union Student {int a;char c;
} stu;

        由于联合体的大小等于其最大成员的大小,所以该联合体所占内存大小为 4 字节。

a(c)aaa

可以用联合体检测大小端存储:

大端存储:低地址放高位高地址放低位

(十进制 1 ,大端存储)

00000000000000000000000000000001

小端存储:高地址放高位,低地址放低位

(十进制 1 ,小端存储)

00000001000000000000000000000000

检测大小端存储代码:

#include<iostream>
using namespace std;
int checkSystem() {union System {int a;char c;char b;} un;un.a = 1;return un.c == 1;
}int main() {cout << checkSystem(); // 输出 1 为小端存储,0 为大端存储 return 0;
}

可以在声明的时候缺省名字: 我们可以在定义的同时 创建该类型的对象,也可以在定义时加上                                                 typedef 对类型起别名 那这样就可以用别名再创建对象了

在定义的同时 创建该类型的对象:

#include<iostream>
using namespace std;
#include <string>
struct{int a;char d;char b;
} stu;int main() {stu.a = 1;cout << stu.a;return 0;
}

输出

1

在定义时加上 typedef 对类型起别名,用别名再创建对象:

#include<iostream>
using namespace std;
#include <string>
typedef struct{int a;char d;char b;
} stu;int main() {stu s;s.a = 1;cout << s.a;return 0;
}

输出

1

二、结构体可以包含函数吗?在 C 和 C++ 中有何不同?

C语言中的结构体通常不包含成员函数,而是使用外部函数来操作结构体的数据。

C++允许在结构体中定义成员函数,这些函数可以访问结构体的私有成员,并且可以像类一样使用封装。

C语言中的结构体没有访问控制的概念,所有成员默认都是公有的,可以直接访问。C++中的结构体可以有访问控制,支持public、private和protected访问修饰符。在C++中,
结构体(struct)的默认访问权限是公有的(public)。这意味着结构体中的成员默认情况
下可以被外部访问。与结构体不同,类(class)的默认访问权限是私有的(private)。
C 中的结构体的使用要加上struct关键字,或者用typedef取别名后直接使用,C++中的结构体使用时不需要加
struct关键字;在 C++ 中直接使用类型名加变量名即可C:struct A{};   int main () {struct A a;}C++:struct A{};int main () {A a;}
C语言中没有构造函数和析构函数的概念。C++中的结构体可以有构造函数和析构函数,允许在创建和销毁结构体实例时执行特定的初始化和清理代码
C的结构体不可以初始化成员,C++中的结构体可以初始化成员变量;
C语言不支持继承,因此结构体不能作为其他结构体或类型的基类。C++支持继承,结构体可以作为基类,允许其他类或结构体继承其属性和方法。

http://www.lryc.cn/news/476250.html

相关文章:

  • layaair做帧动画,等待一秒之后移动坐标,坐标位置明明相同,执行的时候却会抖动。
  • SAP分包业务中能否应用后继物料?
  • 【数据结构】二叉树——判断是否为完全二叉树
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十. 多线程控制帧率。循环播放,QT connect 细节,
  • 近百万奖金!2024 Web3.0 创新大赛重磅来袭!
  • gRPC 一种现代、开源、高性能的远程过程调用 (RPC) 可以在任何地方运行的框架
  • cmake系列-怎么构建不同的C++程序目标文件(可执行程序、动态库、静态库)
  • 使用ffmpeg和mediamtx模拟多通道rtsp相机
  • windows系统类似于linux的nohup命令后台启动jar服务
  • 2024 Rust现代实用教程 流程控制与函数
  • stm32入门教程--USART外设 超详细!!!
  • 再探“构造函数”(2)友元and内部类
  • ffmpeg+vue2
  • 基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法
  • 鸿蒙ArkTS中的image组件
  • LeetCode 684.冗余连接:拓扑排序+哈希表(O(n)) 或 并查集(O(nlog n)-O(nα(n)))
  • 让空气净化器“很听话”-置入NRK3502离线语音控制芯片
  • 8个Visio最佳替代软件推荐,每一款都堪称绘图神器
  • 微服务day02
  • 使用 Logback 的最佳实践:`logback.xml` 与 `logback-spring.xml` 的区别与用法
  • NSET or MSET算法--原理解析
  • NC6 系统配置的消息渠道配置配置涉及相关的表,用户使用admin登录
  • PXC数据库性能测试对比
  • 使用AutoMySQLBackup 数据库自动备份
  • NVR批量管理软件/平台EasyNVR多个NVR同时管理支持对接阿里云、腾讯云、天翼云、亚马逊S3云存储
  • 13.React useTimeout
  • Android待机问题与内存泄露日志定位及bugreport获取分析
  • 访问控制技术原理与应用
  • 详解Rust标准库:Vec向量
  • 网络原理(初一,TCP/IP五层(或四层)模型面试问题)