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

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

[cpp] view
plain
copy

  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, *(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. }

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

如下所示:

[cpp] view
plain
copy

  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、用指向一维数组的指针变量,如下例子所示:

[cpp] view
plain
copy

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #define N   4
  4. void testArray(int (*a)[4], 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, *(*(a+i)+j));  //printf("a[%d][%d] = %d\n", i, j, 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(a, 2, N);
  16. }

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-11-10 10:49:19

二维数组名如何作为参数传递的相关文章

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

如何将二维数组作为函数的参数传递,这是涉及到多维数组时经常要遇到的问题.长期来,我们往往知其然,但不知其所以然.这里简单总结一下. 1.<C程序设计>中讲到:可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如: void Func(int array[3][10]); void Func(int array[][10]); 二者都是合法而且等价,但是不能把第二维或者更高维的大小省略.两个示例程序如下: #include <

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

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

二维数组名和指针

#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目的是为了看出数组名的地址,最后结果显而易见,他的地址也是这个

二维数组名和二级指针

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

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] << ","; }

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

在用二维数组名作为参数传递时容易出现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] =

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

本篇随笔为转载,原贴地址: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]

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

以前二维数组作为函数参数传递我都是这么写的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 *******************