带着孩子学习C++,如何理解:数组vs结构体?
yuyutoo 2024-10-12 00:45 16 浏览 0 评论
先给出答案:
数组将相同类型的值串连到一起,结构体将不同类型的值串连到一起,
数组的实体值无法直接通过赋值进行克隆,结构体的实体值可以克隆。
两者可以组合在一起使用。
一、struct关键词到底是什么?
变量 vs 类型
#include <bits/stdc++.h>
using namespace std;
char x = '#39;;
char y[8] = "abcdefg";
struct tower {
string type;
float attackRange;
};
tower z = {"cannon", 20};
char* w = y;
int main()
{
cout << x << endl;
cout << y << endl;
cout << z.type << ' ' << z.attackRange<<endl;
cout << w << endl;
}
上述代码中,
“x”、"y"、"z"、“w”是一个个变量,
“char”、“char[8]”、"tower"、“char*”是一个个类型,
分别是:基础类型、地址类型、编程者自定义类型。
“struct”相当于类型的类型,即类型的抽象。
二、为什么数组很难用?
数组将相同类型的值串连到一起,
结构体可以将不同类型的值串连到一起。
但是,数组y,
将所有的“实体值”串连后,
给出的y仅代表串连后的“内存地址”可以让编程者控制。
编程者无法通过赋值语句"w=y",实现对“串连后的所有实体值整体”的克隆,
而只是将"内存地址"赋值给了w。
而,
结构体z,
将所有的“实体值”串连后,
给出的z代表了真正的“串连后的所有实体值的整体”。
如下图:
数组的赋值:w=y
vs
结构体的赋值:v=z
从代码上看,数组和结构体做了相同的“赋值”和“赋值修改实体值”
#include <bits/stdc++.h>
using namespace std;
char x = '#39;;
char y[8] = "abcdefg";
struct tower {
string type;
float attackRange;
};
tower z = {"cannon", 20};
char* w = y;
tower v = z;
int main()
{
w[0] = '0';
v.type = "archer";
cout << x << endl;
cout << y << endl;
cout << z.type << ' ' << z.attackRange<<endl;
cout << w << endl;
cout << "hello world";
}
数组y和w,相同的内存地址,相同的实体值,即同一个"本体"。
结构体z和v,不同的实体值,即一个是"本体",另一个是"克隆体"。
三、数组到底是什么?
char x[8] = "abcdefg";
cout << x <<endl;
上述代码中,
“x”是一个变量,
但是它的类型是"char[8]"如下图:
但是,
很多人会认为x的值就是abcdefg,
错误,
我们只能说cout<<x,可以输出abcdefg,
但是,
x的值不是abcdefg。
x的值其实是0x00007ff6ef37008,这是一个内存地址。
数组到底是什么?
回答:
总体来讲,
数组变量的值是“内存地址”,
不是一个“实体的值”。
数组x无法将“实体的值”赋值给数组y,
即,数组无法实现:克隆。
x,y的值必须相同,无法实现“不同值”的功能。
如何实现克隆呢?即如何实现“不同值”的功能呢?
用“结构体struct”。
四、结构体也有缺陷!
结构体的问题是,
数组可以int pos[100];串连100个值,
但结构体要串连100个成员变量显得不太现实。
如何实现“大批量”值的串连且“能克隆”?
如下的方式串连100个int值,显然,不太现实吧。
struct tower {
int pos1;
int pos2;
int pos3;
...
int pos100;
};
那怎么办?
将数组和结构体组合起来使用。
如下代码,
#include <bits/stdc++.h>
using namespace std;
struct tower {
int pos[100];
};
tower x = { 1,2,3,4,5};
tower y = x;
int main()
{
y.pos[0] = 999;
cout << "hello world";
}
看变量x初始化代码:tower x = { 1,2,3,4,5};看起来x像是一个数组,
但其实,x它是数组+结构体。
赋值语句:y=x,
y是x的克隆体,
y复制的是x“串连的100int值”,
而不是x的“内存地址”。
y与x本体,两者内存地址不一样的。
因为当y的值与x的值可以不同,各自独立。
五、如何同时实现:不同类型值的串连、大批量值的串连、还能克隆?
比如我们想实现:tower x = { 1,2,3,4,5,"cannon",20};
回答:通过“数组”+“结构体”实现高阶应用。
#include <bits/stdc++.h>
using namespace std;
struct tower {
int pos[5];
string type;
float attackRange;
};
tower x = { 1,2,3,4,5,"cannon",20.5};
tower y = x;
int main()
{
y.pos[0] = 999;
cout << "hello world";
}
如上图,简单的代码就可以实现多个功能,非常实用。
如果您的孩子也在学习C++,推荐学习一下哦。
相关推荐
- 网络规划建设原来也可以这么简单!
-
废话少说,直接上干货。天气炎热,请各位看官老爷静心阅读。整体思路下图是关于网络建设的所有相关领域,接下来我为大家逐一讲解。网络分层...
- 网络规划设计师笔记-第 1 章 计算机网络原理
-
计算机网络原理1.1计算机网络概论(P1-10)...
- 别输在远见上,网工这样做职业规划,比啥都强
-
01职业中的规划,人生中的buff“职业规划“这个词,其实对很多年轻人,包括曾经年轻的我来说,都不屑一提。...
- 网络规划设计师学习中(个人自学笔记分享1),有一起学习的吗?
-
网络规划设计师,上午考试内容学习:第一章:计算机网络概述(上部分):如果你也在一起学习,那么我们来一起学习吧!坚持1年,争取明年一次性通过!...
- 在微服务中使用 ASP.NET Core 实现事件溯源和 CQRS
-
概述:事件溯源和命令查询责任分离(CQRS)已成为解决微服务设计的复杂性的强大架构模式。基本CQRS表示形式在本文中,我们将探讨ASP.NETCore如何使你能够将事件溯源和CQRS...
- 用 Nginx 部署 ASP.NET Core 应用程序
-
用Nginx部署ASP.NETCore应用程序步骤如下:在Linux中安装.NETCore运行时和Nginx:...
- Asp.net Core启动流程讲解(一)(asp.net core 入门)
-
asp.netcore默认项目包括项目根目录级的Startup.cs、Program.cs、appsettings.json(appsettings.Development.json)launch...
- 十天学会ASP之第五天(十天学会asp教程)
-
学习目的:学会数据库的基本操作1(写入记录)数据库的基本操作无非是:查询记录,写入记录,删除记录,修改记录。今天我们先学习写入记录。先建立一个表单:<formname="form1"met...
- ASP.NET Core 的 WebApplication 类
-
ASP.NETCore提供了3个主机类(Host)。这些类用于配置应用、管理生命周期和启动Web服务。...
- ASP.NET Core中的键控依赖注入(.net依赖注入原理)
-
大家好,我是深山踏红叶,今天我们来聊一聊ASP.NETCore中的FromKeyedServices,它是在.Net8中引入的。这一特性允许通过键(如字符串或枚举)来注册和检索依赖注入(D...
- Asp.net常用方法及request和response-a
-
asp.net教程asp.net常用方法:1、Request.UrlReferrer请求的来源,可以根据这个判断从百度搜的哪个关键词、防下载盗链、防图片盗链,可以伪造(比如迅雷)。(使用全局一般处理...
- asp.net常考面试题(aspnet题库)
-
asp.net常考面试题一,列举ASP.Net页面之间传递值的几种方式?1,使用QueryString,如:......?id=1;response.Redirect()......2,使用Sessi...
- 在Windows系统搭建.NET Core环境并创建运行ASP.NET网站
-
微软于6月27日在红帽DevNation峰会上正式发布了.NETCore1.0、ASP.NET1.0和EntityFrameworkCore1.0,其将全部支持Windows、OSX和...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)