二维数组名做参数传递问题

在用二维数组名作为参数传递时容易出现Segmention Error。这是因为不能正确为二维数组中元素寻址的问题,正确的方法如下:

#include <stdlib.h>
#include <stdio.h>  

#define N   4
void testArray(int *a, int m, int n)
{
    for(int i = 0; i < m; ++i)
        for(int j = 0; j < n; ++j)
        {
            printf("a[%d][%d] = %d\n", i, j, *(a+i*n+j));
        }
}  

int main()
{
    int a[2][N] = {{1, 2, 3, 4}, {5, 6, 7, 8}};  

    testArray((int *)a, 2, N);
}  

1. 将二维数组的两个维度用变量的形式传递过去

如下所示:

[cpp] view
plain
copyprint?

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #define N   4
  4. void testArray(int **a, int m, int n)
  5. {
  6. for(int i = 0; i < m; ++i)
  7. for(int j = 0; j < n; ++j)
  8. {
  9. printf("a[%d][%d] = %d\n", i, j, *((int*)a + i * n +j));
  10. }
  11. }
  12. int main()
  13. {
  14. int a[2][N] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
  15. testArray((int **)a, 2, N);
  16. }

此时在子函数中不能使用a[i][j]的形式访问数组元素,因为数组元素都是顺序存储,地址连续,在使用a[i][j]访问数组元素时,无法顺序访问到指定的元素,所有我们只能通过计算指定所要访问的元素。

2、用指向一维数组的指针变量,如下例子所示:

#include <stdlib.h>
#include <stdio.h>  

#define N   4
void testArray(int (*a)[4], int m, int n)
{
    for(int i = 0; i < m; ++i)
        for(int j = 0; j < n; ++j)
        {
            printf("a[%d][%d] = %d\n", i, j, *(*(a+i)+j));  //printf("a[%d][%d] = %d\n", i, j, a[i * n +j]);
        }
}  

int main()
{
    int a[2][N] = {{1, 2, 3, 4}, {5, 6, 7, 8}};  

    testArray(a, 2, N);
}

int (*a)[N] 表示指向一维数组的指针变量,即a所指向的对象是含有4个整型元素的数组。注意 () 不能少,若定义成:

int *a[N] 则表示有一个一维数组a[N],该数组中的所有元素都是 (int *)类型的元素。

在这里,在子函数中访问二维数组中的元素可以用 a[i][j] 或者 *(*(a+i)+j)

在这种情况下(*(a+i))[j],a [i * n +j]);,*(*(a+i)+j),a[i][j],*((int*)a + i * n +j)都可以进行访问。

时间: 2024-10-05 18:13:05

二维数组名做参数传递问题的相关文章

二维数组名如何作为参数传递

在用二维数组名作为参数传递时容易出现Segmention Error.这是因为不能正确为二维数组中元素寻址的问题,正确的方法如下: [cpp] view plaincopy #include <stdlib.h> #include <stdio.h> #define N   4 void testArray(int *a, int m, int n) { for(int i = 0; i < m; ++i) for(int j = 0; j < n; ++j) { pr

二维数组名和二级指针

1. 指针 1.1 一个指针包含两方面:a) 地址值:b) 所指向的数据类型. 1.2 解引用操作符(dereference operator)会根据指针当前的地址值,以及所指向的数据类型,访问一块连续的内存空间(大小由指针所指向的数据类型决定),将这块空间的内容转换成相应的数据类型,并返回左值. 有时候,两个指针的值相同,但数据类型不同,解引用取到的值也是不同的,例如, 1 char str[] ={0, 1, 2, 3}; /* 以字符的ASCII码初始化 */ 2 3 char * pc

二维数组名和指针

#include <iostream> using namespace std; #define M 2 #define N 3 int main() { int a[M][N] = {1,2,3,4,5,4}; cout<<&(a[0])<<endl; //00DCFA64 cout<<&(a[0])+1<<endl; //00DCFA70,offest:12 cout<<a<<endl; //00DCF

【C语言探索之一】二维数组,二维数组名的意义

1.一维数组 一维数组名,代表两个(1)代表整个数组(虽然谭老爷子的书上说不能,但是只是那个情境下) (2)代表首地址 2.二维数组 想到二维数组在指针方面的理解很是麻烦,所以我自己想了一种理解方式,如下图所示 二维数组名的意义感觉很难受,所以自己来探索下其代表些什么 下面是我的代码和结果 可以看到他们四个的值是一模一样的,但是意义不一样的 1.b数组名,他是指向整个数组的指针, 2.*b是数组第一维的首地址,相当于b[0] 3.&b目的是为了看出数组名的地址,最后结果显而易见,他的地址也是这个

C++二维数组名的再探索

#include <iostream> int main() { int d2a[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; //输出 0,1,2,3,4,5,6,7,8,9,10,11 for (size_t i = 0; i < 3; i++) { for (size_t j = 0; j < 4; j++) { std::cout << d2a[i][j] << ","; }

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

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

C++中关于二维数组作为函数参数传递的问题

在做数据结构迷宫实验的时候,要生成一个二维数组存储迷宫数据,为了保证程序的模块化,将生成部分单独放进一个函数migongsc()里.大致代码如下: 问题的关键就集中在了如何将主函数中声明的二维数组migong[8][9]传递到自定义函数中去. 耗费了一个晚上的时间,我总共整理出了三种办法: 方法1:模拟编译器寻址(本法来自CSDN博客,原文: http://blog.csdn.net/jatix/archive/2004/08/29/88150.aspx). 大体意思为:将二维数组当作参数的时候

C++中关于二维数组作为函数参数传递的问题[转]

在做数据结构迷宫实验的时候,要生成一个二维数组存储迷宫数据,为了保证程序的模块化,将生成部分单独放进一个函数migongsc()里.大致代码如下: 问题的关键就集中在了如何将主函数中声明的二维数组migong[8][9]传递到自定义函数中去. 耗费了一个晚上的时间,我总共整理出了三种办法: 方法1:模拟编译器寻址(本法来自CSDN博客,原文: http://blog.csdn.net/jatix/archive/2004/08/29/88150.aspx). 大体意思为:将二维数组当作参数的时候

二维数组及做推箱子

//定义地图 #region 定义地图 int x=6; int y=1; //人的初始坐标 int a=6; int b=3; //箱子的初始坐标 int[,] map = new int[10, 10] { {8,8,8,8,8,8,8,8,8,8}, {8,0,0,0,0,8,8,0,0,8}, {8,0,8,0,0,8,8,0,0,8}, {8,0,8,8,0,8,8,0,0,8}, {8,0,8,0,0,0,0,0,0,8}, {8,0,0,0,0,8,0,0,0,8}, {8,1,0