C++数组(数组定义方式、数组名作用、数组地址)

2023-11-02


1 数组概述

数组是一个集合,用于存放相同类型的数据元素。

特点1:数组中的每个数据元素具有相同的数据类型
特点2:数组占用一段连续的内存空间


2 一维数组

2.1 一维数组定义方式

注1:数组名的命名规范与变量名命名一致,且数组名不能与变量重名。
注2:数组的下标/索引从0开始。

一维数组定义的3种方式:
(1)数据类型 数组名[ 数组长度 ];

注:定义数组时,若未给定数组元素的初始值,则必须指定初始数组长度,否则提示错误:“不允许使用不完整的类型”。

(2)数据类型 数组名[ 数组长度 ] = { 值1,值2 ...};

注:数组初始化时,若大括号{ }内的元素个数小于定义的数组长度,则剩余数组元素默认使用 0 填充

(3)数据类型 数组名[ ] = { 值1,值2 ...};

注:定义数组元素初始值时,数组可以不指定初始数组长度。

示例

int main() {
	//定义方式1:数据类型 数组名[元素个数];
	int arr[10];
	//使用数组下标对数组元素进行赋值或访问
	arr[0] = 10;
	arr[1] = 20;
	arr[2] = 30;

	//定义方式2:数据类型 数组名[元素个数] =  {值1,值2 ,值3 ...};
	//若大括号{ }内的元素个数小于定义的数组长度,则剩余数据默认使用0填充
	int arr2[10] = { 100,90,80,70,60,50,40,30,20,10 };

	//定义方式3:
	//数据类型 数组名[] =  {值1,值2 ,值3 ...};
	int arr3[] = { 100,90,80,70,60,50,40,30,20,10 };

	return 0;
}

2.2 一维数组数组名

2.2.1 一维数组名称的作用

(1)统计整个数组的长度,例:sizeof(arr) / sizeof(arr[0]);

数组占用内存空间大小:sizeof(arr)
数组单个元素占用内存空间大小:sizeof(arr[0])
数组长度sizeof(arr) / sizeof(arr[0])

(2)获取数组在内存中的首地址,例:arr。

获取数组首地址:arr&arr[0]

注:arr&arr[0]数组首元素的地址 ;
&arr整个数组的地址【地址值相同,含义不同】。


2.2.2 一维数组名的2种特例情况

一维数组名不表示数组首元素地址的两种特例
sizeof(数组名):整个数组的大小;
&数组名:整个数组的地址(地址值与首元素地址相同,但意义不同),表示数组指针

注:其它情况下,一维数组的数组名均表示数组首元素地址,等价于相应的指针类型

示例

int main() {
	//数组名用途
	//1、获取整个数组占用内存空间大小
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

	cout << "整个数组所占内存空间为: " << sizeof(arr) << endl;
	cout << "每个元素所占内存空间为: " << sizeof(arr[0]) << endl;
	cout << "数组的元素个数为: " << sizeof(arr) / sizeof(arr[0]) << endl;

	//2、获取到数组首地址
	cout << "数组首地址为: " << (int)arr << endl;	//17431292 
	cout << "数组中第一个元素地址为: " << (int)&arr[0] << endl;	//17431292
	cout << "数组中第二个元素地址为: " << (int)&arr[1] << endl;	//17431296

	//arr = 10;	//错误:数组名是常量,不可赋值
	
	return 0;
}

注1:数组名是常量,不能进行赋值,否则报错:表达式必须是可修改的左值
注2:对数组名使用sizeof,可获取整个数组占内存空间的大小。


2.3 一维数组的地址

【以整型一维数组int arr[n]为例】

(1) arr 等价于 &arr[0]

  1. 表示数组首元素地址,指向数组第1个元素,arr + 1&arr[0] + 1会跳过第1个元素【加上1个数组元素的字节数】,指向数组的下1个元素。
  2. arr&arr[0]的地址类型为int *类型,使用int类型的指针(指向数组首元素的指针)接收。

(2) &arr

  1. 表示整个数组的地址,指向整个数组,&arr + 1会跳过整个数组【加上整个数组的总字节数】,如int *p = (int *)(&arr + 1),指针p指向数组的末尾。
  2. &arr的地址类型为int (*)[数组长度]类型,使用数组指针(指向数组的指针)接收。

示例

#include <iostream>
using namespace std;

int main() {
	//一维数组
	int arr[5] = { 1,2,3,4,5 };

	/* 一维数组的地址与指针 */
	int* p1 = (int *)(&arr + 1);	//&arr:整个数组的地址	//&arr + 1:指向数组的末尾处
	int* p2 = (int*)(arr + 1);		//arr等价于&arr[0],类型为int *类型:数组首元素地址 
	cout << p1[-2] << endl;		//4
	cout << *p2 << endl;		//2


	cout << arr << endl;			//009DFBB8
	cout << *arr << endl;			//1【第1个元素值】
	cout << arr + 1 << endl;		//009DFBBC	后移4字节【跳过1个元素】
	cout << *(arr + 1) << endl;		//2【第2个元素值】
		
	cout << &arr[0] << endl;		//009DFBB8
	cout << *(&arr[0]) << endl;		//1【第1个元素值】
	cout << &arr[0] + 1 << endl;	//009DFBBC	后移4字节【跳过1个元素】
	cout << *(&arr[0] + 1) << endl;	//2【第2个元素值】

	cout << &arr << endl;			//009DFBB8
	cout << *(&arr) << endl;		//009DFBB8
	cout << &arr + 1 << endl;		//009DFBCC	后移4*5=20字节【跳过整个数组】
	cout << *(&arr + 1) << endl;	//009DFBCC
	
	return 0;
}

2.4 冒泡排序

作用: 常用的排序算法,对数组内元素进行排序,时间复杂度O(n2)
步骤
(1)比较相邻元素:若前一个元素大于后一个元素,则交换两元素;
(2)针对每一对相邻元素重复执行步骤(1),执行完毕后,最大值置于数组的最末尾;
(3)重复以上步骤,每次比较的次数减少1次,直至不再需要比较。

示例: 使用冒泡排序对数组 { 4,2,8,0,5,7,1,3,9 } 进行升序排序。

int main() {
	int arr[] = {4,2,8,0,5,7,1,3,9};

	int len = sizeof(arr) / sizeof(arr[0]);	//数组长度
	int temp;
	//外层循环:每轮对比的次数
	for (int i = 0; i < len - 1; i++) {
		//内层循环:进行比较的元素的索引位置
		for (int j = 0; j < len - i - 1; j++) {
			if (arr[j] > arr[j + 1]) {
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}

	cout << "升序排序后的数组为" << endl;
	for (int i = 0; i < len; i++) {
		cout << arr[i] << " ";
	}

	return 0;
}

3 二维数组

二维数组的每个元素均为一个一维数组,可用矩阵的形式表示。

3.1 二维数组定义方式

二维数组定义的4种方式:
(1)数据类型 数组名[ 行数 ][ 列数 ];
(2)数据类型 数组名[ 行数 ][ 列数 ] = { {数据1,数据2} ,{数据3,数据4} };
(3)数据类型 数组名[ 行数 ][ 列数 ] = { 数据1,数据2,数据3,数据4};
(4)数据类型 数组名[ ][ 列数 ] = { 数据1,数据2,数据3,数据4};

注1:第(2)种定义方式更直观,可提高代码的可读性;第(3)、(4)种根据二维数组的列数推断数组元素(可省略行数,不可省略列数)。
注2:定义二维数组时,若已初始化数据,则可以省略行数

示例:

int main() {
	int arr[2][3] = { {1,2,3},{4,5,6} };

	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
		for (int j = 0; j < sizeof(arr[i]) / sizeof(arr[i][0]); j++) {
			cout << arr[i][j] << " ";
		}
		cout << endl;
	}

	return 0;
}

3.2 二维数组数组名

二维数组名称的作用
(1)计算二维数组所占内存空间

二维数组占用内存空间大小:sizeof(arr)
二维数组第 i 行占用内存空间大小:sizeof(arr[i])
二维数组某个元素占用内存空间大小:sizeof(arr[i][j])

(2)计算二维数组的行数列数

二维数组的行数:sizeof(arr) / sizeof(arr[0])
二维数组的列数:sizeof(arr[0]) / sizeof(arr[0][0])

(3)获取二维数组的首地址

二维数组首地址:arr[0]&arr[0][0]
二维数组第1个元素的地址: arr[0]&arr[0][0]
二维数组第 0 行的地址arrarr[0]arr + 0 【或*(arr + 0)
二维数组第 i 行的地址:arr[i]arr + i 【或*(arr + i)&a[0] + i

注:arr[0]&arr[0][0]二维数组首元素的地址 ;
二维数组名arr二维数组第0行首行)的地址,等价于arr[0]arr + 0

(4)二维数组的其它地址

二维数组第 i 行首元素的地址arr[i]arr + i*(arr + i)&a[0] + i
二维数组第 i 行第 j 列元素的地址&arr[i][j]*(arr + i) + j

(5)通过指针解引用访问或操作某元素:*(*(arr + i) + j)

示例

int main() {
	int arr[2][3] = { {1,2,3},{4,5,6} };

	//二维数组占用的内存空间
	cout << "二维数组大小: " << sizeof(arr) << endl;			//24
	cout << "二维数组一行大小: " << sizeof(arr[0]) << endl;		//12
	cout << "二维数组元素大小: " << sizeof(arr[0][0]) << endl;	//3

	//二维数组的行数与列数
	cout << "二维数组行数: " << sizeof(arr) / sizeof(arr[0]) << endl;		//2
	cout << "二维数组列数: " << sizeof(arr[0]) / sizeof(arr[0][0]) << endl;	//3

	//地址
	cout << "二维数组首行地址:" << (int)arr << endl;				//16053988
	cout << "二维数组第一行地址:" << (int)arr[0] << endl;			//16053988
	cout << "二维数组第一个元素地址:" << (int)&arr[0][0] << endl;	//16053988
	
	cout << "二维数组第二行地址:" << (int)arr[1] << endl;			//16054000
	cout << "二维数组第二个元素地址:" << (int)&arr[0][1] << endl;	//16053992

	system("pause");
	return 0;
}

2.3 二维数组的地址

【以整型二维数组int arr[m][n]为例】

(1) arr[0] 等价于 &arr[0][0]

  1. 表示二维数组首元素地址,指向二维数组第0行第0列元素, arr[0] + 1等价于&arr[0][0] + 1会在二维数组第0行跳过第1个元素【加上1个数组元素的字节数】,指向二维数组第0行的下1个元素。
  2. arr[0]&arr[0][0]的地址类型为int *类型,使用int类型的指针(指向数组第0行首元素的指针)接收。如int *p = arr[0];int *p = &arr[0][0];

(2) arr 等价于 &arr[0]

  1. 表示二维数组第0行地址,指向整个数组,arr + 1会跳过二维数组当前行【加上二维数组每行的总字节数】,如(arr + i)&a[0] + i,指向二维数组的下 i 行
  2. arr&arr[0]的地址类型为int (*)[数组列数]类型,使用数组指针(指向数组的指针)接收。如int (*p)[4] = arr;int (*p)[4] = &arr[0];

(3) &arr

  1. 表示整个二维数组的地址,指向整个二维数组,&arr + 1会跳过整个二维数组【加上整个二维数组(共m * n个元素)的总字节数】,指向数组的末尾。
  2. &arr的地址类型为int (*)[数组行数][数组列数]类型,使用二维数组指针(指向数组的指针)接收。如int (*p)[3][4] = &arr;

示例

#include <iostream>
using namespace std;

int main() {
	//二维数组3行4列
	int arr[3][4] = {
		{1,2,3,4},
		{5,6,7,8},
		{9,10,11,12}
	};


	cout << &arr << endl;			//00DAFB34	//整个二维数组的地址
	cout << &arr + 1 << endl;		//00DAFB64	/后移4*3*4=48字节【跳过整个二维数组的全部12个元素】


	cout << arr << endl;			//00DAFB34	//二维数组第0行的地址
	cout << arr + 1 << endl;		//00DAFB44	后移4*4=16字节【跳过二维数组1行共4个元素】
	cout << arr[1] << endl;			//00DAFB44	后移4*4=16字节【跳过二维数组1行共4个元素】
	cout << &arr[0] + 1 << endl;	//00DAFB44	后移4*4=16字节【跳过二维数组1行共4个元素】

	cout << *(arr + 1) << endl;		//00DAFB44	//二维数组第1行首元素的地址
	cout << *(arr + 1) + 1 << endl;	//00DAFB48	后移4字节【跳过1个元素】


	cout << arr[0] << endl;			//00DAFB34	//二维数组首元素地址
	cout << arr[0] + 1 << endl;		//00DAFB38	后移4字节【跳过1个元素】

	cout << &arr[0][0] << endl;		//00DAFB34	//二维数组首元素地址
	cout << &arr[0][0] + 1 << endl;	//00DAFB38	后移4字节【跳过1个元素】



	/* 数组指针,指向数组长度为4的int数组 */
	//arr或&arr[0]:地址类型int(*)[4]
	int (*p1)[4] = arr;		//正确
	int (*p2)[4] = &arr[0];	//正确

	//&arr:地址类型int(*)[3][4]
	int(*p)[3][4] = &arr;	//正确

	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++数组(数组定义方式、数组名作用、数组地址) 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • windows、Ubuntu安装QT时经常出现“无法下载存档……”解决办法

    说明 以windows为例 ubuntu操作一样 下载好exe执行文件 双击执行时 经常出现下图提示 无法下载存档 是由于默认使用的是境外源 有两种解决方式 方式一 挂魔法在线安装 方式二 使用国内源 清华大学 https mirrors
  • 读阮一峰ES6对象解构赋值小细节

    最近看阮一峰的ES6发现了个地方有点不懂 理解之后 特意记录下来 let obj let arr foo obj prop bar arr 0 foo 123 bar true obj prop 123 arr true 就是上面这块 首先
  • NavicatPremium连接MySQL出现异常Authentication plugin ‘caching_sha2_password‘ cannot be loaded的解决方案

    一 出现异常原因 由于个人本机安装的mysql是8 0 在使用Navicat连接数据库时 出现Authentication plugin caching sha2 password cannot be loaded异常 通过搜集资料得知my
  • 几种常用的无源滤波器的特征

    无源滤波器的缺点 带负载能力差 无放大作用 特性不理想 边沿不陡峭 各级相互影响 滤波器是一种通过一定频率的信号而阻止或衰减其他频率信号的部件 分类 按照处理信号形式 模拟滤波器和数字滤波器 按功能分 低通 高通 带通 带阻 按电路组成分
  • Visio中实现任意两点之间的连线

    参考博客01 https blog csdn net wanzhen4330 article details 84837279 想实现的效果 如下图所示 想要实现的是像下面图中 让箭头线段多次弯折 最终连接两个矩形方框 二 做法 在Visi
  • SQLServer数据库密码已过期问题 处理

    Sqlserver在设置登录账户信息的时候 有个复选框信息会被默认勾上 即强制实施密码策略 默认勾选上的还有强制密码过期 如果勾上了这个强制密码过期后 则你的账户密码在一定时间登录后会提示Sqlserver登录密码已过期请重新设置密码 如果
  • docker-management遇到的一些问题

    一个mysql节点 两个cloudstack management节点 先启动mysql节点 如果cloudstack management容器节点无法访问mysql节点 注意docker宿主机的iptables规则 启动cloudstac
  • 总结一波安卓组件化开源方案

    摘要 为了让大家能快速对android组件化有个整体的认识 本文将从多个维度对目前网上一些有代表性的开源组件化开发方案进行对比 从而更好的区分各组件化方案的特点 快速选择适合自己使用的方案深入学习并使用 在面试中被问到时也能做到心中有数 前
  • PCL 从深度图像中提取边界

    一 图像边界 深度图像边界 计从前景跨越到背景的位置定义为边界 具体有 物体边界 这是物体的最外层和阴影边界的可见点集 阴影边界 毗邻与遮挡的背景上的点集 Veil点集 在被遮挡物边界和阴影边界之间的内插点 它们是有激光雷达获取的3D距离数
  • docker基础6——制作镜像(dockerfile)

    文章目录 一 基本了解 1 1 基于centos构建镜像 1 2 基于alpine制作镜像 二 常用指令 三 制作httpd镜像 一 基本了解 Dockerfile 是一个文本格式的配置文件 可以使用Dockerfile 快速创建自定义镜像
  • 飞机降落(dfs 全排列)

    题目描述 N 架飞机准备降落到某个只有一条跑道的机场 其中第 i 架飞机在 Ti 时刻到达机场上空 到达时它的剩余油料还可以继续盘旋 Di 个单位时间 即它最早 可以于 Ti 时刻开始降落 最晚可以于 Ti Di 时刻开始降落 降落过程需要
  • C# 枚举 enum(学习心得 17)

    枚举是一组命名整型常量 枚举类型是使用 enum 关键字声明的 C 枚举是值类型 枚举包含自己的值 且不能继承或传递继承 超级小白友好 讲解C 基础 每集5分钟轻松学习 拒绝从入门到放弃 声明 enum
  • linux服务器无法ssh怎么解决,linux服务器有可能无法连接ssh

    新安装的linux服务器有可能无法连接ssh 这可是怎么办 我的服务器是centOS6 9的版本 1 首先关闭 SELINUX vi etc selinux config SELINUX enforcing 注释掉 SELINUXTYPE
  • SpringBoot三种注解启动方式

    1 SpringBoot内置了Tomcat Jetty等容器 所以可以通过注解方式进行启动 2 SpringBoot注解启动的原理 SpringBoot main方法 是程序入口 启动SpringBoot项目 创建内置tomcat服务器 使
  • windows 10 webrtc 下载与编译以及遇到的问题

    下载 1 由于webrtc 源码在 墙外 所以需要科学上网 自行解决 当然现在webrtc 有国内的镜像地址 https webrtc org cn mirror 内附编译下载教程自行查阅 下载后只包含M79 和最新的master 分支 由
  • dao层动态sql利器!数据持久化jpa插件spring-data-jpa-extra?Fenix!

    把hibernate mybatis都整合到一个项目中 有没有觉得臃肿繁琐 我们知道 dao层 会用数据持久化框架 如hibernate mybatis等 他们都实现了jpa规范 几年来 spring想统领这个层 有spring jpa d
  • 追踪邮件发送者的地理位置

    今天偶然发现Gmail可以追踪发送者的IP位置 于是忍不住跃跃欲试 邮件不只有文本内容 还有额外的信息在每个邮件的header里面 一般的邮件客户端都是不能查看header的 Gmail和雅虎邮箱可以 网易邮箱的查看信头也能实现 打开Gma
  • 【GitHubShare】Web 前后端开发、以太坊基础、智能合约、密码学、数据分析

    区块链开发指南 作者通过 NFT 进行募资 然后将资金用于激励社区创作 让参与教程编写的人都能获益 从项目创建之初 教程便一直保持开放 GitHub github com dcbuild3r blockchain development g
  • 第二章 主机到网络层(网卡)--基于Linux3.10

    TCP IP协议栈模型 网络协议栈常用OSI七层模型 实际上Linux网络协议栈使用的却是四层模型 图2 1展示了OSI七层和四层模型它们之间各层对应关系 图2 1的最左侧一列是数据在协议栈上各层的称谓 frame位于主机到网络层 Laye
  • C++数组(数组定义方式、数组名作用、数组地址)

    文章目录 1 数组概述 2 一维数组 2 1 一维数组定义方式 2 2 一维数组数组名 2 2 1 一维数组名称的作用 2 2 2 一维数组名的2种特例情况 2 3 一维数组的地址 2 4 冒泡排序 3 二维数组 3 1 二维数组定义方式