关于C语言中二维数组传参————————【Badboy】

直接上代码:

  #include

  void Fun(int *a[],int m,int n)//

  {

  printf("%d\t",*a);//[0][0]

  /*

  int e[2][2][2]={8,7,6,5,4,3,2,1};

  int *f,***g;

  g=e;

  f=e;//有警告,但不会报错

  printf("%d\n",*f);

  */

  }

  /*解释:

  Fun()中的int *a[2]表示定义指针数组a[2],a[0],a[1]存储的都是指针,

  a表示的是数组的首地址,所以相当于二级指针。(解释了实参为什么要是二级指针)

  a既然是指针,赋值时,实参的指针值复制给a,于是*a就表示a[0][0];

  指针的等级只能说明指针的多级指向也是指针,传参时会检查指针等级是否匹配

  但指针存储的都是地址值,地址值改变以后,如指向存储int型数据的存储空间,那么

  前面加*就表示的便是这个int型数

  不同等级的指针之间可以赋值。(解释了*a=4,但**a是错的)*/

  void Fun1(int (*a)[],int m,int n)//int **a会有警告

  {

  printf("%d\t",**a); //int (*a)[2]可以完全用数组来操作

  //int (*a)[] 只能用指针来操作数据

  }

  /*如果为int (*a)[];数组指针,指向数组的指针,二级指针;

  表示数组a[]的地址,老谭称之为"行指针"*/

  int main()

  {

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

  Fun((int **)a,3,2);//

  Fun1(a,3,2);//(int **)

  return 0;

  }

总结:

  1.函数传参:形参就是对实参的简单复制

  2.数组传参不能检查数组的长度(定义的大小)

  3.二维数组传参(多维数组可以转化为二维或一维数组):

  1.强制转化为一维指针,一维数组

  2.通过行指针

  3.强制转化为二维指针(没有意义)。传参之后都只能通过指针寻址访问,数组形式不再适用。

  所以如果行数和列数都不确定的二维数组传参没有必要变成二维数组。因为传参以后也要按照一维数组的方式进行寻址,所以不如直接强制转化为一维数组。

  对于列数确定的二维数组可以传参转化为二维数组。

  如形参定义为int a[][6]; 传参之后还可以像原来的实参一样,通过数组的形式访问,很方便。

  4.数组以非引用类型的传递时,此时数组会自动转换为同类型的指针,即初始化为相应类型实参的副本。

  调用函数时,函数实际操作的是指针的副本,而不会修改实参指针的值,但是可以通过指针改变数组元素的值。--来自网络

  //我的观点:引用传递也是简单的复制,只不过是多了一级指针,可以通过指针操作目标数据(验证后看来是对的)

  引用传递:(来自百度百科)

  在C++中,函数参数的传递方式有引用传递。

  所谓引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中队参数所进行的修改,将影响到实际参数。

  5.参数传递:

  在完成一定功能的函数,参数传递时,如果需要改变实参,最好通过引用传递实现对实参的操作和改变。返回值最好用来返回函数的执行状态 ,以方便在调用函数中检查被调用函数的执行情况,并进行提示。

关于C语言中二维数组传参————————【Badboy】

时间: 2025-01-02 14:04:44

关于C语言中二维数组传参————————【Badboy】的相关文章

C++中二维数组传参的方法详解

C++中二维数组传参的方法详解 首先需要明确,C++中其实没有多维数组,所谓的多维数组,其实就是数组的数组: 另外,数组中元素的个数也是数组类型的一部分. 当一个数组的元素仍然是数组时,通常使用2个维度来定义它,一个数组表示数组本身的大小,另一个维度表示其元素大小(它的元素也是数组): int ia[3][4]; //大小为3的数组,每个元素是含有4个整数的数组 int (*p)[4] = ia;//p指向含有4个整数的数组(指向第一个内层数组) 1 将给定第二维长度的二维数组作为形参传递 #i

C语言中二维数组如何申请动态分配内存

C语言中二维数组如何申请动态分配内存: 使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小 #include <stdio.h> #include <malloc.h> int main() { int **a; int i, j; a = (int**)malloc(sizeof(int*)*3);//为二维数组分配3行 for (i = 0; i < 3; ++i){//为每列分配4个大小空间 a[i] = (int*)malloc(sizeof(int

c语言中二维数组作函数参数以及二维数组的理解

当二维数组作函数参数接受主调函数中的二维数组时,退化为一个指向数组的指针. 在此引用<c与指针>中的观点:作为函数 参数的多位数组名的穿递方式和一维数组名相同--实际传递的是个指向数组第一个元素的指针.但是,两者之间的区别在于, 多维数组的每个元素本身是另外一个数组,编译器需要知道它的维数,以便为函数形参的下标表达式进行求值.

关于C语言中二维数组的P+1与*(P+1)个人浅见

本人第一次在51CTO上发表博客,可能会有一些错误,希望各位大神多多指点!好了,闲言少续,我们进入主题:     在C语言中,有很多数据类型(Int.Float.Char...),那么数组是一种构造类型的数据,个人认为数组是一组具有相同数据类型的数据集合.目前,我们常见的数组为一维.二维的数组. 本文以二维数组为题,首先,我们看一段代码 !     通过代码,我们知道*(P+1),P+1的值是相同的,但含义不同,先说P+1,无论是一维还是二维数组,数组名都可表两层含义:1.指向其起始元素(a[0

关于二维数组传参做形参(转)

二维数组的存储方式是和一维数组没什么区别,但是用二维数组做参数,它的形参该怎样写?要注意的是:函数中的形参其实就相当于一个声明,并不产生内存分配,形参的目的就是要让编译器知道函数参数的数据类型. 正确的是:void Func(int array[3][10]); void Func(int array[][10]);可以省略第一维的大小 错误的是void Func(int array[][].这样的用法只能在初始化时可以用);这样写也是错误:void Func(const int m,const

Pascal语言中二维数组:矩阵问题

[题目]方阵填数:在一个 N*N的方阵中,填入 1,2..... N*N个数,并要求构成如下格式: 图例:10 11 12  1 9  16 13  2 8  15 14  3 7   6   5   4 [上手]观察图例,不难看出这是一个螺旋矩阵,下面是色彩渐变版大图,纯手工制作(有木有2048的赶脚): [核心代码] 1 //变量赋初值 2 x:=0;//横坐标 3 y:=0;//纵坐标 4 i:=0;//要填入的数字 5 k:=n;//每一轮需要填的方格数 6 j:=1;//填数的方向,1

c语言二维数组传递

c语言二维数组传递,目前我总结三种方法,以及纠正一个不能使用的方法 /********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维的长度 * *********************************/ void fun(int a[][3], int n, int m) { int i, j; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) printf(&quo

php 二维数组传递给 js 问题解决记录

需求: php从数据库中读取到二维数组.传递到js中 实现步骤: php:json_encode  →   json  →  js:eval 即在php中使用json_encode()将php的二维数组转化成json格式.传递到js中,使用eval()解析得到js的二维数组. 代码: php: <?php header("Content-Type: text/html; charset=utf8") ; $con=mysqli_connect("url",&q

C语言二维数组作为函数的参数

前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include <cstdio> void print(int *a[3]) { printf("%d\n",a[0][0]); } int main() { int a[2][3] = {1,2,3,4,5,6}; print(a); return 0; } 编译程序时候,在第10行提示错误信息:|