C/C++ 二维数组传参方法总结

[C语言]二维数组传参的格式(详细+总结) 初遇二维数组作函数参数,宛如自己化身为了大头儿子。很头大。 不禁大声呐喊:该怎么声明定义,该怎么调用,又该怎么函数中操作元素和地址? 在此,我要拨开这些问题的一些迷雾。 我相信,有心人看完后,再遇就不会怕了。 其实声明,定义是一样的。因此,只写声明。 同时,把元素外层*()剥去就代表地址。因此只写元素。 最后有总结。 二维数组作函数参数,依我看来,至少可以分成三种。 事先,在main函数中 int... 阅读详情

1, 形参为二维数组, 并给定第二维长度

此方法是最简单最直观的方法,形参与实参一样,容易理解。

int arr[][3]

以杨氏矩阵查找问题为例

int findNumInYangTableau(int arr[][3], int rows, int cols, int num)
{
    if(arr != NULL && rows > 0 && cols > 0)
    {
        int row = 0;
        int col = cols - 1;
        while(row < rows && col > 0)
        {
            if(num == arr[row][col])
            {
                printf("num = (%d, %d)\n", row, col);
                return 1;
            }
            if(num > arr[row][col])
            {
                ++row;
            }
            else
            {
                --col;
            }
        }
    }
    return 0;
}

int main()
{
    int arr[3][3] = {
        {1, 2, 3},
        {2, 3, 4},
        {3, 4, 5},
    };
    int ret = findNumInYangTableau(arr, 3, 3, 4);
    printf("ret expected 1, actual %d\n", ret);

    return 0;
}

2, 形参为指向数组的指针, 并给出数组长度

int (*arr)[3]
int findNumInYangTableau(int (*arr)[3], int rows, int cols, int num)
{
    if(arr != NULL && rows > 0 && cols > 0)
    {
        int row = 0;
        int col = cols - 1;
        while(row < rows && col > 0)
        {
            if(num == arr[row][col])
            {
                printf("num = (%d, %d)\n", row, col);
                return 1;
            }
            if(num > arr[row][col])
            {
                ++row;
            }
            else
            {
                --col;
            }
        }
    }
    return 0;
}

3, 形参为指针的指针

此方法实参必须为指针,而不能为数组名

int findNumInYangTableau(int** arr, int rows, int cols, int num)
{
    ...
}

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

    int* a[3];
    a[0] = array[0];
    a[1] = array[1];
    a[2] = array[2];

    int ret = findNumInYangTableau(a, 3, 3, 4);
                        //这里传(array, 3, 3, 4)会报错

}

还有一种表示

void subfun(int n, char **subargs)  
{  
    int i;   
    for (i = 0; i < n; i++) 
    {  
        printf("subargs[%d] = %s\n", i, subargs[i]);  
    }  
}  

char* arg[] = {
        "abc",
        "cde",
        "efg",
    };
//这种写法和上面的等价
char* b[3];
b[0] = arg[0];
b[1] = arg[1];
b[2] = arg[2];

subfun(3, arg);
subfun(3, b);

但是如果是 int 数组就不适用了
这里写图片描述
编译会报警告, 运行后会段错误
但是int 数组这样写可以

int array[][3] = {
        {1, 2, 3},
        {2, 3, 4},
        {3, 4, 5},
    };

int* a[3];

a[0] = array[0];
a[1] = array[1];
a[2] = array[2];

方法四:形参为指针+数组的行+数组的列

int findNumInYangTableau(int* arr, int rows, int cols, int num)
{
    if(arr != NULL && rows > 0 && cols > 0)
    {
        int row = 0;
        int col = cols - 1;
        while(row < rows && col > 0)
        {
            if(num == arr[row*cols + col])
            {
                printf("num = (%d, %d)\n", row, col);
                return 1;
            }
            if(num > arr[row*cols + col])
            {
                ++row;
            }
            else
            {
                --col;
            }
        }
    }
    return 0;
}

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

    int ret2 = findNumInYangTableau((int*)array, 3, 3, 4);

}

注意这种方法, 如果这个二维数组的空间是 malloc 或者 new出来的, 那么可能会出现异常, 因为malloc 或 new 出来的内存不一定是连续的
而这种方法arr[row*cols + col], 是在访问连续内存

基于YOLOv26的卫星遥感环境监测系统 本文介绍了一个基于YOLOv26的卫星遥感环境监测系统。该系统采用分层架构设计,包含数据采集、预处理、目标检测、图像分析、变化检测等核心模块。技术栈包括YOLOv26、PyTorch、OpenCV等深度学习框架和图像处理工具,以及GDAL、rasterio等地理信息处理库。系统支持获取多种卫星数据源(如Sentinel、Landsat、MODIS)的遥感图像,并进行时间序列分析。通过代码示例展示了数据采集模块的实现,包括卫星图像获取和模拟生成功能。该系统可应用于环境要素检测、变化监测等场景,为环境监测提供智 阅读详情

相关推荐

Delta并联机械手-Codesys实现以及正解逆解研究

由于Codesys的Robotics模块有Delta并联机械手的运动模型,因此借助Codesys的机械手运动模型,研究自己的正解逆解算法。

weixin_42386991的博客 5566

C++笔记 二维数组作为函数的参数详解 三种传参的方法总结 注意要点总结

//二维数组作为函数的参数,一般只有三种写法 //void array_print(int array[2][2]) ////函数的参数声明必须指明数组的列数,数组的行数没有太大关系,因为函数调用时传递的是一个指针,它指向由行向量构成的一维数组 //void array_print(int array[][2]) ////这种形式的函数参数是一个指针,它指向具有两个元素的一维数组 //void array_print(int(*array)[2])

weixin_40933653的博客 2万+

SAP CO实战:如何用KKA2/CJ88结果分析码搞定项目收入成本匹配(附真实案例)

本文深入解析了SAP CO模块中结果分析码KKA2/CJ88的核心应用,通过真实案例详细阐述了如何在成本波动剧烈的销售型项目中,运用结果分析实现收入与成本的精准匹配。文章重点拆解了不同结果分析方法的适用场景与财务影响,并提供了从配置、操作到问题排查的完整实战指南,帮助财务顾问提升项目财务管理能力。

qsc9012345的博客 609

二维数组传参

本文会介绍二维数组常见的三种传参方式,以整形数组为例。 1.int arr[行数][列数] int arr[2][4] = { 1,2,3,4,0,1,2,3 }; 例如将上面的二维数组传入下方的函数 函数形参可以如下设置 void Print(int arr[2][4], int m, int n) { int i = 0,j=0; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { printf("%d ", ar

weixin_54818033的博客 1万+

LLaVA-1.5:多模态视觉问答新突破

LLaVA-1.5在多模态视觉问答(VQA)任务中取得了显著进展,主要得益于视觉-语言连接器的优化和特定任务数据集的增加。通过将连接器升级为两层MLP,模型在处理视觉与语言关系时表现更佳。同时,引入如OKVQA、OCRVQA等数据集,增强了模型在复杂视觉推理任务中的能力。在11个基准测试中,LLaVA-1.5超越了现有方法,展示了其强大的多模态能力。此外,模型通过提升输入图像分辨率、扩展语言模型和改进多语言能力,进一步提升了性能。尽管在短格式回答任务中初期表现不佳,但通过调整提示格式和微调,其性能显著提升

weixin_57060548的博客 945

鸿蒙OS开机动画背后的秘密:从代码到视觉的完整解析(附源码分析)

本文深入解析了鸿蒙OS开机动画的系统级实现原理。从bootanimation服务的启动配置、与Render Service的协同,到基于VSync信号的帧率同步与绘制流水线,结合OpenHarmony源码进行了逐行解读。文章揭示了其事件驱动的优雅退出机制,并探讨了视频支持、多屏适配等高级特性与定制化可能,为开发者理解鸿蒙图形子系统提供了硬核技术视角。

sony5的博客 973

【C++】二维数组传参方式

本篇博客讲解了C语言和C++在二维数组传参方式上的不同,以及讲解了解决办法

EWIAW_ilove的博客 4783

第四章 自定义组件、动画

第三章 自定义组件、动画 (一)自定义View 1.1) onMeasure:对当前View的尺寸进行测量 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) widthMeasureSpec和heightMeasureSpec包含测量模式和尺寸大小 int widthMode = MeasureSpec....

Stay Hungry Stay Foolish 求知若饥 虚心若愚 8132

c++之二维数组参数传递

背景 int a[2][2]={ {4, 6}, {9, 11} }; 我定义了这样一个数组,我想把这个数组作为参数,传递到一个函数中,并要在函数中能引用该二维数组的元素,我该怎么做? 第一种方式是直接传递二维数组,但是必须标明第二维的值,因为如果只是传递a[][],编译器无法分配这样的数组,所以要这样传int a[][3] 第二种方法是传递指针数组方式,即int (*a)[3] 第三种是传递指针方法。 代码实现 方法1:传递数组,注意第二维必须标明 //二维数组传参问题示例 #incl.

ancy的博客 6489

SNN目标识别MNIST

总体来说这篇论文提出的方法用了多种更精密的细节,如LIF膜电位公式,三种STDP方法,但我觉得还可以有很大的改进,比如输入层全连接到兴奋层,兴奋层通过抑制层实现的侧向抑制,抑制层不参与学习等等。尤其是兴奋层通过抑制层实现侧向抑制这里,当神经元兴奋时,通过抑制层再倒回兴奋层,所抑制的已经经过一了一段时间的延迟。如有错误,请不吝赐教。

m0_74982304的博客 1263

Android Audio基础——系统服务(二)

AudioService 继承自 IAudioService.Stub。IAudioService.Stub 类很明显是通过 IAudioService.aidl 自动生成的。AudioService 位于 Binder Native 端。AudioManager 拥有 AudioService 的 Binder Proxy 端,是 AudioService 在客户端的一个代理。几乎所有客户端对 AudioManager 进行的请求,最终都会交由 AudioService 实现。

小旭的专栏 2075

C/C++二维数组传参方法

C++二维数组传参方法 #include <stdio.h> #include <iostream> const int M=5; const int N=5; using namespace std; void array_init_v1(int A[][N]) { int i,j,count=0; for(i=0;...

你听我说,在这个地方你这样做,才是对的。 1533

基于卷积神经网络CNN实现电力负荷多变量时序预测(PyTorch版)

随着智能电网的发展,精准的电力负荷预测对能源调度和电网稳定具有重要意义。本文基于PyTorch框架,提出一种基于卷积神经网络(CNN)的多变量时间序列预测模型,用于电力负荷的短期预测。

时序笔记 988

C/C++二维数组的传参方法总结

C/C++语言二维数组的传参方法总结 转自:http://www.51testing.com/html/25/n-845125.html C/C++语言将二维数组作为参数传递容易使人迷惑且易出错,本文将常用的几种方法列出,以方便用时查阅。三种方法总结如下(GCC验证成功):   方法一:形参为二维数组并给定第二维长度   此方法是最简单最直观的方法,形参与实参一样,

deng_sai的专栏 4万+

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

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

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C/C++语言二维数组的传参方法总结

转载 https://blog.youkuaiyun.com/gqb_driver/article/details/8886687 C/C++语言将二维数组作为参数传递容易使人迷惑且易出错,本文将常用的几种方法列出,以方便用时查阅。三种方法总结如下(VS2005/GCC验证成功): 方法一:形参为二维数组并给定第二维长度  此方法是最简单最直观的方法,形参与实参一样,容易理解。 举例: #inclu...

踏实每一小步,成就一大步 1565

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

linux下二维数组怎么传参,C/C++语言二维数组的传参方法总结

C/C++语言将二维数组作为参数传递容易使人迷惑且易出错,本文将常用的几种方法列出,以方便用时查阅。三种方法总结如下(GCC验证成功):方法一:形参为二维数组并给定第二维长度此方法是最简单最直观的方法,形参与实参一样,容易理解。举例:#include void subfun(int n, char subargs[][5]){int i;for (i = 0; i < n; i++) {pr...

weixin_32941303的博客 640

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C/C++二维数组作为函数传参的方法总结

C/C++二维数组作为函数传参的方法总结方法一 将给定第二维长度的二维数组作为形参传递方法二 使用给定第二维长度的指针作为形参传递方法三 将二维数组指针转换成一维数组指针作为形参传递方法四 使用二级指针作为形参传递测试代码输出欢迎点赞收藏 方法一 将给定第二维长度的二维数组作为形参传递 //将给定第二维长度的二维数组作为形参传递 void printArray1(int arr[][5],int row) { cout<< "------"<<__func__<<

大谷的代码日记 3547

C/C++ 一维数组的传参/一级指针的传参 二维数组的传参/二级指针的传参 三维数组的传参/三级指针的传参 方法总结分析终极篇

序 最近复习c/c++数组的传参,发现了一些问题,下面是一些总结和思考 正文 一维数组的传参/一级指针的传参/普通指针 在理解指针的基础上,一维数组的指针传递很简单,我们知道数组的数组名就是这个数组首元素的地址,所以将数组名传入函数就可以了 // 一维数组的传递0.cpp # include <stdio.h> void f(int *pArr, int len) {//这里传入...

GMCN的博客 1814

C/C++二维数组总结

1、关于定义二维数组 先说在前面,一般的我们说的C/C++中的二维数组是定义在栈中的二维数组。比如定义了一个array[3][4],那就指的是定义了一个三行四列的矩阵形状的二维数组,如下图所示。这样的矩阵在内存中是以箭头右边的方式存放的,也就是说实际上我们定义的二维数组在内存中仍然像是一维数组那样连续存储的。可以想象为把一个矩阵一层层伸展铺平。 因此可以使用如下方法定义二维数组: 方法一...

哆啦A瑶的博客 5万+

数组传参,指针传参

数组传参,指针传参

qq2127189274的博客 270

c语言函数的传参

传参

south_windOvO的博客 655

C语言字符指针变量、数组指针变量

代码中的*(*(p + i) + j)很有说法,当p + i时,为 int *[5] 类型,当*(p + i) + j时,为 int* 类型,*(*(p + i) + j)时就为 int 类型了,逐层转变。第一行的一维数组的类型就是 int [5] ,所以第一行的地址的类型就是数组指针类型 int(*)[5]。第二天代码描述的是一个p2指针,其指向了一个,有10个元素,每个元素为 int 类型的数组。的区别,一个表示数组首元素地址,一个表示整个数组的地址,一个类型为 int* 一个类型为。

喜羊羊的博客 1906
上一篇: Linux -- 进程间关系和守护进程
下一篇: 二叉树的基本操作
rugu-sco
博客等级 码龄10年 487粉丝 124原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值