二维数组如何作为函数参数使用?(转)

如果我们需要编写一个处理二维数组的函数,那么这个函数原型应该如何声明呢?

首先,我们应该牢记:数组名被视为其地址,因此,相应的形参是一个指针。例如,假设有如下的代码:

[cpp] view plaincopy

  1. int data[3][4] = { {1, 2, 3, 4}, {5, 5, 7, 8}, {9, 10, 11, 12} }
  2. int total = sum(data, 3);

那么sun函数的原型应该如何声明呢?为什么将行数3作为参数,而不将列数4作为参数呢?

我们可以这样理解:data 是一个数组名,该数组有3个元素。而这3个元素本身都是又4个 int 组成的数组。因此 data 的类型是 指向由4个int组成的数组的指针。

因此正确的 sum 原型如下:

[cpp] view plaincopy

  1. int sum( int (*arr) [4], int size);
  2. //其中的括号是必不可少的,因为下面的声明将声明一个由四个指向int的指针组成的数组,而不是一个指向由4个int组成的数组的指针。
  3. int *arr[4];   //声明了一个指针数组,这个数组包含4个int指针变量
  4. int (*arr)[4] //声明了一个指针变量,这个指针指向由4个int组成的数组

还有另外一种声明格式,含义与上述正确原型完全相同,但是可读性更强:

[cpp] view plaincopy

  1. int sum(int arr[][4], int size);

上述2个原型都指出,arr 是指针而不是数组。还需要注意的是:int arr [ ] [4] 的含义就是: arr 是指向由4个 int 构成的数组的指针。因此,指针类型指定了列数,也就是说:函数形参已经确定了实参数组的列数,这就是为什么没有将列数作为独立的函数参数进行传递的原因。

时间: 2024-08-24 06:05:56

二维数组如何作为函数参数使用?(转)的相关文章

二维数组如何作为函数的参数传递

二维数组在内存中使按数组的排列规则存储(按行存放),因此在函数原型中的二维数组的形参必须给定列的大小 对于如下数组 int main() { int a[3][2] = {1,2,3,4,5,6}; print1(a); return 0; } 错误范例: void print1(int **b) void print1(int b[3][]) 没有给定列的大小,编译器不能确定数据的存储顺序(有多少行多少列),因此无法读取到指定行列的数据 实际上函数调用时传入的实参是int (*)[2], 因此

二维数组与方法(函数)

二维数组 什么是二维? ? 比如(合金弹头.超级玛丽) ? 二维数组里面放一维数组. 什么是二维数组? ? 二维数组本质上是以数组作为数组元素的数组,即“数组的数组”, ? 二维数组又称为矩阵,行列数相等的矩阵称为方阵 怎么创建一个二维数组? 数据类型[][] 对象名 = new 数据类型[x][y]; x代表行 y代表列 例如:  int [ ][ ] a = new int [2] [2]; 数组 : 使用索引来操作元素, 下面给二维数组赋值 a[0] [0] = 1; //第一行第一列 a

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

以前二维数组作为函数参数传递我都是这么写的void def(int a[][10]).传递一个二维数组a,(其中第二维要确定大小)其实想一想挺合理的... 后来,发现还有这种写法 void def(int(*a)[10]): /* *********************************************** Author :guanjun Created Time :2017/3/18 13:32:52 File Name :33.cpp *******************

定义一个二维数组反置函数

#include<stdio.h> //定义一个3*3数组反转函数 void fan(int a[3][3]){ int i,j; int t[3][3]; for(i=0;i<3;i++) for(j=0;j<3;j++) t[i][j]=a[j][i]; for(i=0;i<3;i++){ for(j=0;j<3;j++) printf("%d ",t[i][j]); printf("\n"); } return 0; } /

二维数组和二级指针作为参数传给参数的方式

  一.如果要将二维数组传给一个函数,有几种传参方式?     1).直接将二维数组传给函数.     eg:         void test(int arr[3][4]); 2).以数组指针的方式传入.     eg:         void test(int (*arr)[4]); 第一种方式很容易理解.第二方式我们来分析分析.首先将二维数组看作是一个一维数组,有三个元素,arr[0],arr[1],arr[2].每个元素中有四个元素.例如,(arr[0])[0],(arr[0])[1

Swift语言学习No.2: 二维数组

之前在教程中学习了二维数组,原本里面很多知识点都不甚了解,后来经过一番资料查找,基本上理解透彻了,做个总结吧. 老规矩,先上代码: class Array2D<T> { let columns: Int let rows: Int var array: Array<T?> init(columns: Int, rows: Int) { self.columns = columns self.rows = rows array = Array<T?>(count:rows

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h> void main(void) { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int *p = a; p < a + 10;p++)  //指针类型决定4个字节 { printf("\n%p,%d", p, *p); } getchar(); } 指针数组 #inclu

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

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

一步一步教你用Swift开发俄罗斯方块:No.3 二维数组

数组是一个很有用的数据结构,很多程序都建立在数组之上,我很少看到哪个应用程序不用到数组的. 而我们的俄罗斯方块显然也需要数组,而且是更为特殊的  二维数组. 为什么是二维数组呢?其实我们的整个游戏区域,可以看做是一个二维数组区域,就像这样: 我们的每一个block都占据在这样一个20x10的区域之内,20行,10列的一个200个block的二维数组让我们可以根据(x,y)坐标来确定block的位置,而这些blocks其实就是组成我们的L形,或者Z形 等等不同但我们都熟知的俄罗斯方块: swift