二维数组作为函数的参数和返回值

数组指针取*号、指针作为函数的返回值、指针保存函数的地址(函数指针)、特殊指针、main函数传参 阅读详情

1. 二维数组作为函数的参数

 (1)错误的做法:将二维数组传递给二维指针

//实参是二维数组,形参是int**,这样做的话编译器会报错
int main() {
       int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
       int row = sizeof(arr) / sizeof(arr[0]); //行数
       int column = sizeof(arr[0]) / sizeof(arr[0][0]); //列数
       cout << row << " " << column;
       printArray(arr,3,4);
       return 0;
}
void printArray(int** arr, int size_1, int size_2) {
       for (int i = 0; i < size_1; i++) {
              for (int j = 0; j < size_2; j++) {
                     cout << arr[i][j] << ' ';
              }
       }
}

原因分析:类比一维数组可以传递给指针,我们就会想当然的将二维数组传递给二维指针,但实际运行会发生错误,原因是,二维数组的类型是type (*)[size],而二维指针的类型是type**,是属于两个不同的类型,以上述程序为例,int arr[3][4]是一个包含了3个指向长度为4的数组的指针数组,而int ** 是一个指向int * 的指针,两者不可等同。
 (2)正确的做法:将二维数组传递给数组指针

printArray(arr,3,4);
void printArray(int(*arr)[4], int size_1, int size_2) {
       for (int i = 0; i < size_1; i++) {
              for (int j = 0; j < size_2; j++) {
                     cout << arr[i][j] << ' ';
              }
       }
}

[注]:要注意区分 int (*arr)[4]和 int* arr[4]后者是指针数组,它表示一个数组,并且数组中有4个指针变量,前者是数组指针,是指向一维数组的指针。

2.将二维数组作为函数返回值

将二维数组返回是通过二维指针实现的,举个例子:

int** returnArray()
{
       int arr[3][4] = { 0,1,2,3,4,5,6,7,8,9,10,11 };
       int row = 3; //行数
       int column = 4; //列数
       int** rArr;//定义二维指针
       rArr = (int**)malloc(row * sizeof(int*)); //初始化二维数组的行
       for (int i = 0; i < row; i++) {
              rArr[i] = (int*)malloc(column * sizeof(int)); //初始化二维数组的列
              rArr[i] = arr[i];// 这样赋值是错误的,因为arr会在函数调用结束后就自动回收,这样指向该地址的指针的值就不确定了
       }
       //赋值
       for (int i = 0; i < 3; i++) {
              for (int j = 0; j < 4; j++) {
                     rArr[i][j] = i * 3 + j + i*1; // 0,1,2,3,4,5,6,7,8,9,10,11
              }
       }
       return rArr;
}

//主函数
int main() {
       int** rArr = returnArray();
       for (int i = 0; i < 3; i++) {
              for (int j = 0; j < 4; j++) {
                     cout << rArr[i][j] << ' ';
              }
       }
       return 0;
}

[注]:如果二维数组或者一维数据是在所调用函数内申请的,这时一定要用new或者malloc去申请空间的分配(堆空间),如果使用如int arr[3][4]; 这种形式的话,其空间分配是在栈里面,随着函数调用结束就会被自动回收,其返回内容不确定性。。

JavaScript【字符串数组实操、二维数组转化一维数组 、数组去重、数组排序、 函数概述、函数的重复声明、 函数名的提升、 函数的属性和方法、函数作用域、函数参数】(七) JavaScript【字符串数组实操、二维数组转化一维数组、数组去重、数组排序、函数概述、函数的重复声明、函数名的提升、函数的属性和方法、函数作用域、函数参数】(七) 阅读详情

相关推荐

将一维数据(序列)转化为二维数据(图像)的方法汇总GAFS, MTF, Recurrence plot,STFT

虽然深度学习方法(1D CNN, RNN, LSTM 等)可以直接处理一维数据,但是当前的深度学习方法主要还是处理二维结构数据的,特别是在计算机视觉CV以及自然语言处理NLP领域,各种各样的方法层出不穷。因此,如果能够将一维序列数据转化为二维(图像)数据, 则可以直接结合CV以及NLP领域的方法,是不是很有趣! GAF, GASF, GADF, MTF, Recurrence Plot, STFT, 短时傅里叶变换

MasterQKK 5万+

函数返回二维数组

在C语言中,函数不能直接返回二维数组,因为数组名作为函数参数或返回值时,会退化为指向数组首元素的指针。此外,C语言不支持返回局部数组的引用,因为局部数组在函数返回后其内存会被释放。

这是博客描述 1329

Containerd容器运行时的私有仓库镜像推送push和镜像拉取问题解决

向/etc/containerd/config.toml配置添加如下配置,然后重启containerd。向/etc/containerd/config.toml配置添加如下配置,然后重启containerd。通过crictl为k8s拉取镜像如下所示。可以通过ctr命令进行镜像推送。往私有仓库推送镜像如下。

Bulut0907 1万+

C++ 二维数组创建&&二维数组作为函数返回值&&二维数组作为形参

1. 二维数组常用创建方法 静态二维数组 ① 确定行和列 a. 不确定元素 int a[2][2]; b. 部分元素确定 int a[2][3] ={1,2,3,4}; c. 确定元素 int a1[2][2] = {{1,2,}{3,4}};//标准的二维数组初始化方式 //在写明列号时{1,2,3,4}也可 ②不指明行,指明列 //a. 经典写法: int array[][3]; //b. 利用指针: int (*array)[3]; 动态二维数组 ① 利用指针创建 //c++使用ne

bi_an_never的博客 1万+

STM32 SYSTICK定时器及延时函数详解

STM32 SYSTICK及延时函数详解 SysTick定时器 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心

w1050321758的博客 2367

手把手教你用ArduPilot搭建低成本无人车(附APM飞控+有刷电调配置清单)

本文提供了一份基于ArduPilot开源平台搭建低成本智能无人车的详细实战指南。核心内容包括APM架构飞控的选型、双向有刷电调的兼容性配置与校准、系统连接逻辑,以及通过Mission Planner地面站进行参数调校和自主导航功能设置的完整流程,帮助爱好者快速实现从手动控制到自主行驶的跨越。

java5的博客 850

c/c++ 一维数组、二维数组作为函数参数、返回值

c/c++ 一维数组、二维数组作为函数参数、返回值 一、一维数组作为参数 传入数组 int [] 为了规范,常常需要将数组的size一同传入,这是因为C++/C遇到参数为数组时,不会去一个个拷贝数组内的元素(太过于耗时),此时数组在函数内退化为数组首地址。 使用sizeof(array)/sizeof(array[0])得到1,可以验证我们前面的说法。 一般情况下,函数内经常需要使用数组的size,此时就需要我们将size传入函数。 int sum(int array[], int size) #inclu

qq_41854911的博客 8982

中兴FTTR光猫变简易OLT:低成本搭建全光监控与局域网实战指南

本文详细介绍了如何将中兴FTTR光猫改造为简易OLT设备,实现低成本全光监控与局域网扩展。通过LOID认证、桥接模式设置及终端数破解,用户可利用二手设备搭建高性能光纤网络,适用于远程监控和长距离组网场景,显著降低部署成本。

chair的专栏 2037

二维数组的传递和返回

二维数组和特殊的二级指针,二维数组的传递和返回。

cnxayv的专栏 1883

扣子(coze)实战 | 一键生成爆款书单视频

摘要:本文介绍了一个基于DeepSeek和Coze平台实现短视频高效生成的工作流方案。该方案耗时仅1-2分钟即可完成"假如书籍会说话"类短视频制作,包含书籍内容深度解读、对话台词生成、自动配音、素材合成等环节,支持通过剪映进行二次编辑。作者分享了完整开发思路和8个工作模块,并开放了包含该工具在内的100+智能体共享空间,提供会员专属服务。该方案为非真人出镜短视频的批量化生产提供了可行方案。

yueyehuguang的博客 2395

Oracle EBS Interface/API(29) - AP发票API

续上编文章《Oracle EBS Interface/API(28) - 客制化开发AP付款API》背景,介绍如调用官方提供标准AP发票API调用 用户界面 Invoices(Payables Manager->Invoices->Entry->Invoices) Open Interface Invoices(Payables Manager->Invoices->Entry->Open Interface Invoices) 快速参考 参考点 内容.

陈显平的专栏-Oracle EBS 1151

函数的参数和返回值为数组和函数

传入数组很简单, 指针变量代数组。 传出数组用指针, 长度可以在前面。 参数函数还可以, 百变多端的函数!

xiaoyin35的博客 963

计算机视觉论文复现指南:从理论到可运行代码的保姆级教程

计算机视觉论文复现指南:从理论到可运行代码的保姆级教程​ ,人工智能,计算机视觉,大模型,AI,本文围绕计算机视觉论文复现展开,介绍从理论到可运行代码的全流程。先强调复现的重要性,再讲解复现前的准备,包括明确目标、构建工具链;接着说明代码获取分析、环境配置调优、调试运行技巧及结果验证优化方法,还推荐了高效工具,提及复现中的伦理规范。旨在助读者掌握复现方法论,实现从经典模型到前沿论文的复现,推动学术成果落地。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 12万+

JavaScript 1029 二维数组 函数

二维数组 (1)定义二维数组; var arr=[[],[],[]]; arr[0] arr[1] arr[2] arr.length ===>3 (2)初始化二维数组 var arr=[ [1,2,3], [3,4,5,5], [6,7,8], ] arr[1][1] arr[2][2] 函数 1.什么是函数? 函数就是重复执行的代码片。 把一段相对独立的具有特定功能的代码块封装起来,形成一个独立实体,就是函数,起个名字(函数名),在后续开发中可以反复调用函数的作

m0_51589015的博客 216

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

二维数组做函数参数 及返回值

#include<stdio.h> #include<stdlib.h> //c++中函数不能直接返回一个二维数组 //当需要函数的返回值为一个二维数组,可采用typedef typedef int(*R)[3]; R transpose(int arr[][3], int rows, int cols) //不能写成int ** transpose(int **a ,int...) { f

Wenbin_Yang 1355

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

c语言二维数组排序函数_C语言数组和函数

原来一个人真的可以难过到没有语言,没有情绪,就在那静静地发呆,突然鼻子一酸,眼泪就掉下来了。。。---- 网易云热评一、数组1、一维数组#include int main() { //int arr[5]; //数组声明语句,数组里包含5个整数类型的存储区 //int arr[5] = {1, 2, 3, 4, 5}; //数组初始化的方法 //int arr[...

weixin_31925745的博客 1989

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【c语言】指针的速记 指针的作用 函数指针,指针数组,二维数组指针……

[1] c语言指针 [2]《深入理解计算机系统》大黑书 [3] C语言字符串指针(指向字符串的指针)详解 前言:一切都是地址 计算机所有的数据都必须放在内存中才能运行,这涉及到代码数据的链接和加载。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。 实际上,计算机无法分别内存中到底是数据还是代码。当数据被加载到内存内存中后,代码就变成了程序(从静态变成了动态),操作系统会给不同的内存块指定...

清凌的博客 624

(2020-10-29)javascript二维数组和函数

知识梳理: 二维数组 定义二维数组: var arr=[[],[],[]]; 初始化二维数组: var arr=[ [1,2,3], [3,4,5,5], [6,7,8], ] 获取二维数组中所有的数据:for循环嵌套 for(var i=0;i<arr.length;i++){ for(var j=0;j<arr[i].length;j++){ console.log(

Missjuzi的博客 522

函数参数的引用型定义

函数 返回值类型 函数名(参数定义列表) { … } 调用方法:函数名(参数列表); int add(int a,int b) { return a+b; } 调用:result = add(1,2); void F() //函数所做的事情不需要从参数列表中传入数据,只靠函数本身的功能即可。 { ... } 调用:F(); 错误示范: int result = 0; void getRusult(int r) { ++r; } 调用:getResult(result);//只是把result的数

weixin_46716100的博客 1507

C语言——二维数组与函数

摘要:二维数组定义形式为"类型说明符 数组名[行数][列数]",如int matrix[3][4]。数组元素按行优先连续存储,引用时下标从0开始。函数定义包括返回类型、函数名、形参列表和函数体,通过return语句返回值。示例展示了使用两个子函数求三个数最大值的方法,先两两比较再与第三数比较。

weixin_69590097的博客 228

C语言(二维数组、函数、指针、地址传递与值传递)笔记-day3

Linux C基础-day03 摘要:主要讲解了二维数组、指针、函数。 对二维数组的初始化、遍历二维数组及注意事项类比一维数组,深入浅出的讲解;函数的参数、返回值、命名规范以及类别进行了详细的阐述,并结合指针进行了编程练习,值传递和地址传递的区别

weixin_47409584的博客 2527

二维数组的一些问题

先谈一下二维数组的动态创建和撤销,代码如下:    //动态建立10*10的二维数组      int **p=new int*[10];    for(int i=0;i!=10;++i)    {        p[i]=new int[10];    }    for(int a=0;a!=10;++a)    {        for(int b

dijkstar的专栏 1552

Day17 指针变量做函数形参 指针函数 函数指针

指针变量做函数形参 指针函数 函数指针

AppreciateIt的博客 2383

C语言——数组(3)及 函数

主函数写在其他函数之后,所以主函数是程序的入口,函数的调用可以提高代码的复用性,降低程序的耦合性,简单的说就是善于用于函数,以减少程序的重复编写。如:a[3][4] = {{1,2,3,4},{5,6,7},{8,9,10,11},我们知道当数组赋值个数少于数组的元素个数,会补零。一个C语言程序可以由一个主函数和若干个其他函数组成,主函数可以调用其他函数,其他函数也可以调用其他函数。在C语言中,函数参数用于传递值,函数的值指返回值 ,表示输出结果,函数调用通过函数名和参数列表实现具体操作。

2401_84676053的博客 829

二维数组详解:定义、引用与实战

返回值类型 函数名(形式参数列表)// 函数体:实现功能的代码return 返回值;// 与返回值类型匹配返回值类型:函数执行后返回的数据类型(无返回值用void)。函数名:自定义名称,遵循标识符规则。形式参数列表:函数接收的输入(格式:类型 参数名,多个参数用逗号分隔,无参数可写void)。例如,计算两数之和。int ret;return ret;输入一个数的范围,输出范围内所有能被3整除的数。int i;i <= end;++i)

2301_80981525的博客 904

二维数组 字符串 指针

IOS学习第12天二维数组 二维数组在内存中的存储 1.二维数组在内存中也是”从高到低申请连续内存的”,一共有行 * 列 * sizeof(单个元素的数据类型)2.第0行是在”低”字节 二维数组的地址和行列计算 1.二维数组的地址 == 二维数组名 == 二维数组的低地址 == 二维数组中第0行的地址 == 二维数组中第0行第0个元素地址 == 二维数组第0行的低字节地址2.二维数组的长度以及行

MA7777777__的博客 2307
上一篇: 输出指向字符/字符串数组的指针变量输出乱码的情况
下一篇: 类中定义static变量后,visual studio编译时提示LNK2001“无法解析的外部符号”
嗯行家啊
博客等级 码龄9年 27粉丝 13原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值