二维数组作为函数的参数

C语言中二维数组作为函数参数传递的方式 一 1. 方式一 直接以 // 方式一 //void printMatrix(int matrix[3][3], int matrixRow, int matrixCol) void printMatrix(int matrix[][3], int matrixRow, int matrixCol) { int row, col; for (row = 0; row < matrixRow; row++) { for (col = 0; col < matrixCol; col++ 阅读详情

问题:已有二维数组a[n][m] (m,n为常量整数)

int a[n][m];

如果我们要编写一个函数对这个数组进行处理,我们应该怎样声明函数的形参,又怎样在调用函数时引入二维数组这个参数呢?

  • 首先我们来看对一维数组是怎么做的

void main()
{
    int vec[n];
    fun1(vec);    
}

对函数传参时,直接把一维数组的名字作为参数传入。

在定义函数的形参时有两种方式

void fun1(int *vec);

void fun1(int vec[]);

因为这里的vec同时也是一个指向整形的指针,指向的是数组第一位的元素,所以以上两种形参都是符合要求的。

在fun1函数的实现里面,可以通过*(vec+i)或者vec[i]来访问数组元素。

  • 那么二维数组是跟上面的方法一样吗

如果是按一维数组的方式,会写成这样

void fun2(int **a)
{
    a[i][j];
}
void main()
{
    int a[n][m];
    fun2(a);
}

这是错误的写法。原来我是错误的把二维数组的名字a理解成指针的指针,而实际上这里的a是一个指向整形数组的指针

int (*p)[m];

比如这个p就是一个指向包含m个整形元素的数组的指针,p=a的操作是合法的。

所以fun2的原型可以是以下形式(假设m=10)

void fun2(int (*mat)[10]); //假设m=10
void fun2(int mat[][10]);

这样我们就可以在函数原型中访问二维数组的元素mat[i][j]
这里我们需要注意的是在定义时多维数组的第2个及以后的下标不能为空,为什么是这样设定呢,拿二维数组举例,二维数组的元素在内存空间的地址是连续的,从mat[0][0]开始,一直到mat[0][m-1],接着是mat[1][0]到mat[1][n-1],也就是说“每一行”的数据是接在上一“行”数据的后面存放的所以mat[i][j]相对于mat[0][0]的位置是i*(m-1)+j,编译器就是通过这样的方式来从一维的存储地址中找到二维数组的元素,所以第二维的长度m的值是必须的,而第一维的长度n的值是可以省略的。

  • 如果定义形参时不知道数组的大小呢

对于一维数组来说,因为在定义形参时是不用指明数组大小的,自然没有这个问题,但是二维数组作为形参时是至少要写明第二维及以后的维度的长度,而很多时候数组的大小是不确定的,这时该怎么办呢。

这时我们可以想,如果可以像一维数组一样可以通过第一个元素的地址加上偏移量来访问数组元素就好了,实际上这是可行的。

上面提到二维数组名字a是“一个指向包含m个整形元素的数组的指针”,同一维数组名字vec指针指向的是数组的第一个元素相似,二维数组名字a指向的是二维数组中第一个“包含m个整形元素的数组”,即以0为一维坐标的这段数据的这个数组a[0],对a这个一维数组再取地址&a,就可以得到a[0][0]的地址,即整个二维数组在存储空间中的第一个数的地址,通过这个地址,再结合上面提到的求二维数组的地址偏移量的方法就可以实现通过首地址加地址偏移量的方法来访问数组的内容。所以我们可以用下面这种方式实现

void fun2(int *head,n,m)
{
    *(head+i*(m-1)+j) //访问mat[i][j]的值
}

void main()
{
    int n,m;
    ...     //给n和m赋值
    int mat[n][m];
    fun2(&mat,n,m);
}

以上理论参考自《c和指针》p159

总结:二维数组的不同主要还是因为二维数组的名字和一维数组的名字的含义不同,还有二维数组的存储方式对于语法的影响,这些都跟编译器的设定有关,更高维的数组又是什么样的设计还没了解,记得以前见过一个题提到java中二维数组必须有第一维的长度,而c中必须有第二维的长度,是因为java的二维数组是另外一种存储方式还是因为java的编译器是另外的寻址规则,这些还可以进行更加深入的探究

 

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

相关推荐

二维数组作为函数参数

#include <iostream> #include <Windows.h> //版本一 省略函数 //二维数组省略一个高维函数 但低维位函数必须定义 void printf1(int a1[][3]){ for(int i=0; i<3; ++i){ for(int j=0; j<3; ++j){ printf("%d\t", a1[i...

零界 2562

C语言:二维数组传参的格式(详细+总结)

希望能帮助到你,我将无比快乐。 你的点赞✌️,是我前进的动力。 初遇二维数组作函数参数,宛如自己化身为了大头儿子。很头大。 不禁大声呐喊:该怎么声明定义,该怎么调用,又该怎么函数中操作元素和地址? 在此,我要拨开这些问题的一些迷雾。 我相信,有心人看完后,再遇就不会怕了。 其实声明,定义是一样的。因此,只写声明。 同时,把元素外层*()剥去就代表地址。因此只写元素。 最后有总结。 二维数组作函数参数,依我看来,至少可以分成三种。 事先,在main函数中 int a[m][n]; 好了,进入主题。

weixin_44498318的博客 1万+

如何将二维数组(静态的和动态的)作为函数的参数传递

今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不至于再在这上面浪费时间。       下文是我从互联网上download的一篇文章,讲的很好,但是我后面将指出问题所在,并加以改进,希望对你有所帮助:   首先,我引用了谭浩强先生编

程序员的自我修养_Will.zhang 2541

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

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

weixin_40933653的博客 2万+

保姆级教程:从AD导出Gerber到HFSS 3D Layout导入,搞定PCB电磁仿真全流程

本文提供从Altium Designer导出Gerber文件到Ansys HFSS 3D Layout导入的完整PCB电磁仿真流程指南。详细讲解Gerber文件导出设置、HFSS中的3D模型重建技巧,以及电磁仿真中的常见问题解决方案,帮助工程师高效完成高速电路和射频设计的性能验证。

weixin_30379531的博客 708

catia之车灯设计——灯玻加厚之后(单层灯玻、多层灯玻的设计)

加厚完A面后如果主机厂没有给其他的面我们该怎么做?

qq_19829077的博客 1304

二维数组作函数参数

二维数组名作为参数传递使用时,形参要定义为数组指针的形式: 二位数组名就是数组指针类型 int func(int (*p)[n],int len1,int len2) n一定要是一个常数值,即指明数组指针变量指向有几个元素的一维数组 一维数组名和二位数组名的比较 一维数组数组名类型是指针: int arr1[10]; arr1-----int * 二维数组数组名类型是数组指针(而且必须指明一维数组元素个数): int arr2[2][10]; arr2-----int (*)[2]

m0_60274660的博客 1万+

关于示波器测485串口波特率的使用方法总结

之前没有用过示波器,更不知道怎么来测试串口的波特率,结果遇到一客户说我们产品的波特率达不到9600,只有9100,为了验证这一说法,我们只能自己测试一下。说明:产品通过485接电脑,用串口调试助手接收都是没有问题的,用客户的设备接收就有问题。 下面说一下示波器测波特率的方法步骤: 显示高低跳变的情况: 1.先把示波器表笔的地线(夹子)夹485B,表笔夹485A。 2.往串口发送数据:如发送

lianxue1986的专栏 3万+

C语言二维数组作为函数参数传递

二维数组存放方式 二维数组在内存中是按行存放的,先存储第一行,在接着存储第二行….. 二维数组作为函数参数 二维数组作为函数的参数,实参可以直接使用二维数组名,在被调用函数中可以定义形参所有维数的大小,也可以省略以为大小的说明。例如: void find(char a[3][10]); void find (char a[ ][10]); 也可以使用数组指针来作为函数参数,例如: ...

weixin_41666244的博客 7万+

Abaqus CEL分析必备:Hypermesh网格导出与inp文件合并技巧

本文详细介绍了在Abaqus CEL分析中使用Hypermesh生成六面体网格并合并多组件inp文件的完整流程。从单元类型设置(EC3D8R)、网格质量优化到inp文件合并技巧,提供了一套解决流固耦合仿真前处理痛点的实战方案,帮助工程师高效完成复杂CEL分析任务。

weixin_29279101的博客 213

从零构建爬虫抓取故宫数字文物库:Python最新实战技术详解

熟悉了动态内容加载的网页结构解析技巧。掌握了 Playwright + BeautifulSoup 的组合用法。实现了从网页→JSON→详情→图像的完整数据闭环。掌握了结构化保存与可视化分析能力。

2201_76125261的博客 1307

如果二维数组作为函数的参数会怎样???

二维数组作为函数的参数 二维数组作为函数的参数传递, 不是单纯的值传递, 传递的是数组本身. demo.c #include <stdlib.h> #include <stdio.h> /* 版本1 指明参数 */ void print1(int a[3][4]) { for (int i = 0; i < 3; i++) { for (int j = 0;...

weifc-wei 的博客 661

数据分析案例-汽车客户信息数据可视化分析

本数据集来源于kaggle,原始数据集共有8068条,11个特征变量,各变量含义解释如下:ID:客户IDGender:客户性别Ever_Married:客户婚姻状况Age:客户年龄Graduated:客户是毕业生吗?Profession:客户的职业Work_Experience:多年工作经验Spending_Score:客户的消费评分Family_Size:客户家庭成员人数(含客户)Var_1:客户的匿名类别Segmentation:(目标)客户的客户群。

m0_64336780的博客 1万+

二维数组用于函数的参数

行指针,二维数组传参

qq_57503964的博客 1020

从 Open SQL JOIN 走向 ABAP CDS Association:把查询写成可复用的数据模型

摘要: 本文通过飞行模型示例,对比了ABAP中三种表关联实现方式:Open SQL JOIN、CDS显式JOIN和CDS Association。重点解析了Association的本质是将表关系声明为数据模型语言,使用时通过路径表达式按需展开为JOIN。文章指出路径表达式在不同位置会默认展开为不同JOIN类型(如SELECT列表默认为LEFT OUTER),并演示了如何用[inner]强制指定INNER JOIN。最后结合S/4HANA实际案例,说明Association通过中心化关系定义和路径复用,能有效

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 383

测绘程序设计——试题一:出租车轨迹数据计算

仅展示试题1的原文,如需了解其余内容,请自行购买图书李老师著作主页-http://ybli.users.sgg.whu.edu.cn/book/

chengzilhc的博客 891

在C++中如何将二维数组作为函数参数

一直以来弄不清C++中数组怎么作为参数传入函数中,尤其是最近学了Python之后,Python这种几乎可以把一切作为参数传入函数的方式更是让我在C++中混淆,下面来总结一下二维数组作为函数参数该如何表示。 1、二维数组的概念   在C语言中,二维数组实际上是一种特殊的一维数组,它的每个元素也是一个一维数组。因此,二维数组下标形式正确写法如下:int arrays[i][j]。数组元素是按照行顺

智哥随便写写 5万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

二维数组作为函数参数问题

可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如:     void Func(int array[3][10]);     void Func(int array[][10]);     二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:     void Func(i

sunshinewave的专栏 1936

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

二维数组作为函数参数传递剖析(C语言)

前言: 很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错: //对于一个2行13列int元素的二维数组 //函数f的形参形式 f(int daytab[2][13]) {...} //以下两种可以忽略行数 f(int daytab[][13]) {...} f(int (*daytab)[13]) {...} 甚至会有人告诉你多维数组作为参数传递可以省略第一维,其他维不能省略。然而你对这种形式并不满意:如果事先限定了二维数组的大小,函数的泛用性就要大打折扣了。因为你真正需要的,是可

zou_albert的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C语言中如何将二维数组作为函数的参数传递

今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不至于再在这上面浪费时间。 正文: 首先,我引用了谭浩强先生编著的《C程序设计》上面的一节原文,它简要介绍了如何 将二维数组作为参数传递,原文如下(略有改变,请原谅): [原文开始] 可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如: voi

赵凯月的博客 1万+

C的实用笔记21——二维数组作为函数的参数

1、2、

lzh201864031的博客 2179

二维数组传参(二维数组作为函数参数)

传递参数是二维数组 二维数组传参,函数形参的设计只能省略第一个[ ]的数字; 因为对于二维数组,可以不知道有多少行,但必须知道一行多少个元素; #include<iostream> using namespace std; void test(int arr[3][4]) { // 表明数组行列数 } void test(int arr[][4]) { //省略数组列数 } /* void test(int arr[][]) { //写法错误,不可省略列数 } */ int mai

weixin_42322256的博客 1万+

二维数组作为函数参数传递

二维数组作为函数参数调用过程中: void Fun(**a, m, n) { //.... } //.... Fun(a,m,n); 调用函数过程中,会发现VS报错: //IntelliSense: "int (*)[3]" 类型的实参与 "int **" 类型的形参不兼容 这怎么难得倒我?反手一个Ctrl+C Ctrl + V 百度一下,原来强制类型转换一下就ok! Fun((int ...

kittimzhe的博客 1211

二维数组作为函数参数*

** 二维数组作为函数参数 ** 规定:如果将二维数组作为参数传递给函数,那么在函数的参数声明中必须指明数组的列数,数组的行数没有太大关系,可以指定也可以不指定。因为函数调用时传递的是一个指针,它指向由行向量够成的一维数组。因此二维数组作为函数参数正确写法如下所示: void Func(int array[3][10]); void Func(int array[ ][10]); 因为数组的行数无关紧要,所以还可以写成如下形式: void Func(int (array)[10]); 注意array需要用

weixin_44358746的博客 577
上一篇: C语言中size_t类型详细说明【转载】
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值