[C++] 数组 详解

[C++] 数组 详解

前言

大家好啊,zty来更C++的基础之一,那就是数组,作为一个我们做题或者是开发一些内容都不可或缺的一个知识,那我们今天就来深入的去了解一下他,给他来个详解好吧,上一周的多态详解没有到100赞啊,这个博客我想要个100赞可不可以,zty呢最近在冲榜,大家多多支持一下啊,我的目标就是在寒假结束以前冲进前3000好吧,马上正月十五了,祝大家阖家团圆好吧

                                                  先   赞   后   看    养   成   习   惯 

众所周知,一篇文章需要一个头图,但我家盛产头图

                                                  先   赞   后   看    养   成   习   惯  

上面那行字怎么读呢,让大家来跟我一起读一遍吧,先~赞~后~看~养~成~习~惯~

演示用编译器及其标准

Dev C++ 6.7.5 Red panda 

想下载编译器的宝宝们点我好吧

标准是 C++14(其实C++11也可以的)

目录

前言

演示用编译器及其标准

作者有话说

    先   赞   后   看    养   成   习   惯  

正文

概述

一维数组

定义方式

一维数组定义的3种方式:

1,数据类型 数组名[ 数组长度 ];

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

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

一维数组名 

 一维数组名称的作用

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

一维数组的地址 

一维数组的排序

sort

二维数组

二维数组定义方式

二维数组数组名 

 二维数组的地址

 好啊今天的数组呢就讲到这里,为什么讲的这么短呢因为我懒,因为这个数组本身就比较好理解

后记


作者有话说

最近,作者也是高光了一回啊,写的那片篇结构体博客,被洛谷站长给推荐了(kkksc03),这哥们可是个大人物啊,接下来上图片好吧

                                               

                                                                           先   赞   后   看    养   成   习   惯  

正文

终于到正文了,不瞎掰掰直接开始

概述

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

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

 举个例子,就像城市中的那种高层楼房,占用了一块连续的空间,而且那个楼里边呢每一个屋子基本都是一个类型的,这个就是数组,当然我举的这个例子是一位数组,二维数组呢就像一个棋盘,每一个格子中放的类型都是一样的,还有三维四维五维等等,但是我们都不常用,我也就不去挨个的举例子了

一维数组

定义方式

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

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

就像这样

int zty[114514];
注:定义数组时,若未给定数组元素的初始值,则必须指定初始数组长度,否则提示错误:“不允许使用不完整的类型”。
 2,数据类型 数组名[ 数组长度 ] = { 值1,值2 ...};

就像这样

int zty[6]={1,1,4,5,1,4};

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

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

就是这样

int zty[]={1,1,4,5,1,4};
注:定义数组元素初始值时,数组可以不指定初始数组长度。

来个示例要不然不清楚 

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; } 
一维数组名 
 一维数组名称的作用

(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种特例情况

一维数组名不表示数组首元素地址的两种特例:

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; cout << "数组中第一个元素地址为: " << (int)&arr[0] << endl; cout << "数组中第二个元素地址为: " << (int)&arr[1] << endl; //arr = 10; //错误:数组名是常量,不可赋值 return 0; } 
 注1:数组名是常量,不能进行赋值,否则报错:表达式必须是可修改的左值
注2:对数组名使用sizeof,可获取整个数组占内存空间的大小。
一维数组的地址 

【以整型一维数组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<bits/stdc++.h> 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; cout << *p2 << endl; cout << arr << endl; cout << *arr << endl; cout << arr + 1 << endl; cout << *(arr + 1) << endl; cout << &arr[0] << endl; cout << *(&arr[0]) << endl; cout << &arr[0] + 1 << endl; cout << *(&arr[0] + 1) << endl; cout << &arr << endl; cout << *(&arr) << endl; cout << &arr + 1 << endl; // 后移4*5=20字节【跳过整个数组】 cout << *(&arr + 1) << endl; // return 0; }

一维数组的排序

通常的一维数组主要是用 sort 进行排序。

sort

 sort使用起来这非常的简单,只需要一行代码

sort(数组名,数组名+数组需要排序的长度,排序方法);

这三个参数我们一个个来讲

第一个参数是数组名,这个好理解这个应该就不需要讲了吧,就是你需要排序的数组名

第二个参数呢,只需要排序的长度,这个地方可以填树也数也可以填变量

第三个参数呢是排序方法,这个是可以不填的,不填的话默认就是从大到小排序,如果是填的话需要单独写一个函数,这个函数呢要有两个参数而且不能是void类型,返回值是排序方法

给大家来个示例啊

#include<bits/stdc++.h> using namespace std; int cmp(int a, int b) {//这个是从小到大排序 return a > b; } int main() { int zty1[6] = {1, 1, 4, 5, 1, 4}; int zty2[6] = {1, 1, 4, 5, 1, 4}; // 不填第3个参数的情况下 sort(zty1, zty1 + 6); for (int i = 0; i < 6; i++) { cout << zty1[i] << " "; } cout<<endl; // 填第3个参数的情况下 sort(zty2, zty2 + 6, cmp); for (int i = 0; i < 6; i++) { cout << zty2[i] << " "; } return 0; }

一维数组呢我们就讲完了,接下来我们讲二维数组

二维数组

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

二维数组定义方式

二维数组定义的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; } 
二维数组数组名 

二维数组名称的作用

(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; } 
 二维数组的地址

【以整型二维数组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];

(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; } 

 好啊今天的数组呢就讲到这里,为什么讲的这么短呢因为我懒,因为这个数组本身就比较好理解

后记

作者:zty郑桐羽呀

联系方式:(不挂了,有事看主页QQ号加QQ)

兄弟们给个赞呗

                                                  先   赞   后   看    养   成   习   惯  

Read more

openclaw新手入门指南:一文看懂环境搭建、模型配置与 WebUI 远程访问

openclaw新手入门指南:一文看懂环境搭建、模型配置与 WebUI 远程访问

目录 * 1. 基础设施层:OpenClaw 运行环境的初始化 * 2. 算力与模型层:蓝耘 MaaS 平台的接入配置 * 2.1 协议适配与 JSON 配置 * 3. 编排层:OpenClaw 初始化与 Onboarding 流程 * 3.1 模式选择与基础设置 * 3.2 模型提供商与应用集成策略 * 3.3 技能库(Skills)装载与服务启动 * 4. 网络架构与网关(Gateway)配置 * 4.1 网关暴露与安全策略 * 4.2 Web UI 远程访问与设备配对(Device Pairing) * 5. 高级模型编排与 JSON 配置深度解析

By Ne0inhk
【前端】Vue 组件开发中的枚举值验证:从一个Type属性错误说起

【前端】Vue 组件开发中的枚举值验证:从一个Type属性错误说起

🌹欢迎来到《小5讲堂》🌹 🌹这是《小程序》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!🌹 👨💻 作者简介 🏆 荣誉头衔:2024博客之星Top14 | ZEEKLOG博客专家 | 阿里云专家博主 🎤 经历:曾多次进行线下演讲,亦是 ZEEKLOG内容合伙人 以及 新星优秀导师 💡 信念:“帮助别人,成长自己!” 🚀 技术领域:深耕全栈,精通 .NET Core (C#)、Python、Java,熟悉主流数据库 🤝 欢迎交流:无论是基础概念还是进阶实战,都欢迎与我探讨! 目录 * 前言 * 解决过程 * 一、错误场景还原 * 1.1 错误发生的位置 * 1.2 常见的触发场景 * 二、深入理解 Vue

By Ne0inhk
从安装到实测:基于 Claude Code + GLM-4.7 的前端生成与评测实战

从安装到实测:基于 Claude Code + GLM-4.7 的前端生成与评测实战

目录 引言 一、命令行使用 Claude Code(安装与配置) 步骤一:安装 Claude Code(命令行) 步骤二:配置蓝耘MaaS平台 步骤三:常见排查 二、编码工具中使用 claude-code:三个端到端案例(含提示与实测评价) 案例 1:交互式个人血压记录网页 — 前端端到端生成 案例 2:Web 双人对战小游戏(Joy-Con 风格) 案例 3:前端可视化组件生成 三、补充建议(快速 checklist) 总结 引言 近一年来,代码生成类工具逐渐从“写几行示例代码”走向“完整功能交付”,但真正落到工程实践时,很多工具仍停留在 Demo 阶段:要么跑不起来,

By Ne0inhk

[特殊字符] AI印象派艺术工坊前端交互:画廊滚动与图片缩放体验优化

🎨 AI印象派艺术工坊前端交互:画廊滚动与图片缩放体验优化 1. 引言 1.1 业务场景描述 在“AI印象派艺术工坊”这一轻量级图像风格迁移Web应用中,用户上传照片后,系统基于OpenCV的计算摄影学算法,无需依赖深度学习模型即可生成素描、彩铅、油画、水彩四种艺术风格图像。整个流程高效稳定,适合边缘设备或低资源环境部署。 然而,随着功能完善,用户体验成为新的优化重点。尤其是在结果展示环节,用户需要在移动端和桌面端均能流畅浏览五张图像(原图+四类艺术图),并对细节进行查看。当前采用的静态卡片式布局在小屏设备上存在滑动不顺、缩放卡顿等问题,影响整体使用满意度。 因此,本文聚焦于画廊滚动与图片缩放体验的前端交互优化,结合现代CSS与JavaScript技术,提出一套适用于此类轻量化AI图像应用的高性能、响应式画廊解决方案。 1.2 痛点分析 现有画廊界面存在以下问题: * 横向滚动卡顿:使用基础overflow-x: scroll时,缺乏惯性滚动与平滑动画,操作生硬。 * 图片缩放体验差:移动端双指缩放常被浏览器默认行为干扰,无法精准控制。 * 响应式适配不足:不

By Ne0inhk