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

如何将二维数组作为函数的参数传递,这是涉及到多维数组时经常要遇到的问题。长期来,我们往往知其然,但不知其所以然。这里简单总结一下。

1.《C程序设计》中讲到:可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如:

void Func(int array[3][10]);
void Func(int array[][10]);

二者都是合法而且等价,但是不能把第二维或者更高维的大小省略。两个示例程序如下:

#include <iostream>
using namespace std;
void fun(int a[2][2],int n)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cout<<a[i][j]<<endl;
        }
    }
}

void main() {
    int test[2][2]={{1,2},{3,4}};
    fun(test, 2);
    cin.get();
}

上面程序提供了二维数组中两个维度的大小,再看下面:

#include <iostream>
using namespace std;
void fun(int a[][2],int n)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cout<<a[i][j]<<endl;
        }
    }
}

void main() {
    int test[2][2]={{1,2},{3,4}};
    fun(test, 2);
    cin.get();
}

上述两段程序均可正常运行,输出结果:

为什么必须要提供第二维度的大小呢?因为编译阶段,编译器要为a[i][j]正确寻址。a[i][j]的地址为:a+i*列数(第二维大小)+j。

2.如果在函数参数中传入二维指针int **,二维指针中包含了a、a[0]/a[1]、数据三层结构。

int**已经提供了a[0]及a[1]的地址,这样在对a[i][j]寻址的过程中,就不需要第二维大小来确定a+i*列数(第二维大小)了。程序如下:

#include <iostream>
using namespace std;

void fun(int **a,int n)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cout<<a[i][j]<<endl;
        }
    }
}

void main() {
    int **test = new int*[2];
    for(int i=0;i<2;i++)
    {
        test[i] = new int[2];
    }
    test[0][0] = 1;test[0][1] = 2;test[1][0] = 3;test[1][1] = 4;
    fun(test, 2);

    cin.get();
}

3.如果把二维数组名传递给int**,编译阶段将会报错:不能将参数 1 从“int [2][2]”转换为“int **。因为二维数组的结构和二维指针是不同的,在底层,二维数组的结构和一维数组是一样的。在二维数组中,a和a[0]均指向数组首地址,而且二维数组是按行顺序存储的。

所以说二维数组和二维指针是大大不同的,二维数组的结构基本和一维数组是一样的。这样,把二维数组传递给int**的程序也就不难理解了,如下:

#include <iostream>
using namespace std;

void fun(int **a,int n)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cout<<*((int*)a+i*n+j)<<endl;//二维数组a结构实质就是一维数组
            //传入时强制转化为int**,底层变成了两层指针结构是错误的,这里要强制转化为一层结构
            //由于强制转换的int** 是错误的,所以不能把它当做二维指针来用,不能使用a[i][j]
        }
    }
}

void main() {
    int test[2][2]={{1,2},{3,4}};
    fun((int **)test, 2);
    cin.get();
}

我的理解大致就是这样了。

时间: 2024-10-13 21:31:09

二维数组作为函数的参数传递的相关文章

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

可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如: void Func(int array[3][10]); void Func(int array[][10]); 二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的: void Func(int array[][]); 因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无

如何将二维数组作为函数参数

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

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

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

【转载】二维数组的动态分配和参数传递

本篇随笔为转载,原贴地址:http://www.cnblogs.com/bigshow/archive/2009/01/03/1367661.html. 1. C语言动态分配二维数组 (1)已知第二维 Code-1 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(char *) * m); printf("%d\n", sizeof(a));//4,指针 printf("%d\n", sizeof(a[0]

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行提示错误信息:|

二维数组作为函数参数的几种方法

#include <stdio.h> #define N 5 void fun1(int a[N][N]) { int i,j; for (i=0;i<N;i++) { for (j=0;j<N;j++) { if (i>j) { a[i][j]+=a[j][i]; a[j][i]=0; } } } } void fun2(int **a,int m,int n) { int i,j; for (i=0;i<m;i++) { for (j=0;j<n;j++) {

二维数组作为函数参数深度详解

        前几天和同学讨论数组作为函数参数,感觉各种困惑.花了一些时间在网上查看了一些资料,并加上自己的理解.记录一下! 一. 指向指针的指针和指向数组的指针 很多人以为"指向数组的指针"就是"指向指针的指针",于是有人写这样的代码: int a[3][4]; int **p = a; //错误 数组实际类型是int [3][4],在作为右值时可以被转化为int (*)[4],它们都和int **不同,自然不可用. 那么,你要用一个指针来指向a,就要用一个

二维数组做函数参数、指向指针的指针做函数参数

这里有一篇文章  写的很好http://blog.csdn.net/f81892461/article/details/8974087 该文章中有一句话  总之就是:数组无法作为参数,总会被编译器将地址赋值给形参指针的,即使指针定义成数组形式,也还是指针.然后各种差别都是由数组和指针不同的定位元素的方式导致的. 这句话说的很对啊,数组做形参的是时候都是被当成指针来处理的.不明白这句话的可以看一下,参考文章链接里的那幅图,注意比较一下下图中的两个:data+1,第一个data+1指向的是元素dat

C++二维数组做函数参数

二维数组做函数参数的形式主要有: /对于一个m行n列int元素的二维数组 //函数f的形参形式 f(int daytab[m][n]) {...} //以下两种可以忽略行数 f(int daytab[][n]) {...} f(int (*daytab)[n]) {...} 这里都不能忽略第二维的大小.主要 原因是二维数组在栈内分配的内存是连续的,它的每一行都有相同的元素,这样,array[i][j] 和 *(*(array +i) +j)是一样的,程序是知道array+i的i实际上偏移了i*N