[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

Python实现 MCP 客户端调用(高德地图 MCP 服务)查询天气示例

Python实现 MCP 客户端调用(高德地图 MCP 服务)查询天气示例

文章目录 * MCP 官网 * MCP 官方文档中文版 * 官方 MCP 服务示例 * Github * MCP 市场 * 简介 * 架构 * 高德地图 MCP 客户端示例 * python-sdk 客户端 * java-sdk 客户端 MCP 官网 * https://modelcontextprotocol.io/introduction MCP 官方文档中文版 * https://app.apifox.com/project/5991953 官方 MCP 服务示例 * https://github.com/modelcontextprotocol/servers Github * python-sdk:https://github.com/modelcontextprotocol/python-sdk * java-sdk:

By Ne0inhk
43-dify案例分享-MCP-Server让工作流秒变第三方可调用服务

43-dify案例分享-MCP-Server让工作流秒变第三方可调用服务

1.前言 之前我们为大家介绍过MCP SSE插件,它能够支持MCP-server在Dify平台上的调用,从而帮助Dify与第三方平台提供的MCP-server进行无缝对接。有些小伙伴提出了疑问:既然Dify可以通过MCP SSE插件调用其他平台的MCP-server,那么Dify的工作流或Chatflow是否也能发布为MCP-server,供其他支持MCP client的工具使用呢?今天,我们将为大家介绍一款Dify插件——mcp-server,它能够实现这一功能,即将Dify的工作流或Chatflow发布为MCP-server,供其他第三方工具调用。 插件名字叫做MCP-server,我们在dify插件市场可以找到这个工具 Mcp-server 是一个由 Dify 社区贡献的 Extension 类型插件。安装后,你可以把任何 Dify 应用转变成符合 MCP 标准的 Server Endpoint,供外部 MCP 客户端直接访问。它的主要功能包括: * **暴露为 MCP 工具:**将 Dify 应用抽象为单一 MCP 工具,供外部 MCP 客户端(如

By Ne0inhk
【MCP】详细了解MCP协议:和function call的区别何在?如何使用MCP?

【MCP】详细了解MCP协议:和function call的区别何在?如何使用MCP?

本文介绍了MCP大模型上下文协议的的概念,并对比了MCP协议和function call的区别,同时用python sdk为例介绍了mcp的使用方式。 1. 什么是MCP? 官网:https://modelcontextprotocol.io/introduction 2025年,Anthropic提出了MCP协议。MCP全称为Model Context Protocol,翻译过来是大模型上下文协议。这个协议的主要为AI大模型和外部工具(比如让AI去查询信息,或者让AI操作本地文件)之间的交互提供了一个统一的处理协议。我们常用的USB TypeC接口(USB-C)统一了USB接口的样式,MCP协议就好比AI大模型中的USB-C,统一了大模型与工具的对接方式。 MCP协议采用了C/S架构,也就是服务端、客户端架构,能支持在客户端设备上调用远程Server提供的服务,同时也支持stdio流式传输模式,也就是在客户端本地启动mcp服务端。只需要在配置文件中新增MCP服务端,就能用上这个MCP服务器提供的各种工具,大大提高了大模型使用外部工具的便捷性。 MCP是开源协议,能让所有A

By Ne0inhk
【大模型系列篇】大模型基建工程:基于 FastAPI 自动构建 SSE MCP 服务器

【大模型系列篇】大模型基建工程:基于 FastAPI 自动构建 SSE MCP 服务器

今天我们将使用FastAPI来构建 MCP 服务器,Anthropic 推出的这个MCP 协议,目的是让 AI 代理和你的应用程序之间的对话变得更顺畅、更清晰。FastAPI 基于 Starlette 和 Uvicorn,采用异步编程模型,可轻松处理高并发请求,尤其适合 MCP 场景下大模型与外部系统的实时交互需求,其性能接近 Node.js 和 Go,在数据库查询、文件操作等 I/O 密集型任务中表现卓越。 开始今天的正题前,我们来回顾下相关的知识内容: 《高性能Python Web服务部署架构解析》、《使用Python开发MCP Server及Inspector工具调试》、《构建智能体MCP客户端:完成大模型与MCP服务端能力集成与最小闭环验证》   FastAPI基础知识 安装依赖 pip install uvicorn, fastapi FastAPI服务代码示例  from fastapi import FastAPI app

By Ne0inhk