如何将二维数组作为参数传给一个函数?

liufeifei 2006-07-14 09:28:10
我现在写一个函数,函数的参数是一个二维数组:x[2][2]

函数为:void A(...)函数的参数就是这个二维数组
参数该怎么写,才能在函数中依然以x[m][n]的方式获得数组元素的值呢?
有人说写成 int **,好像不行的。
...全文
3363 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
CrazyDogHH3 2006-07-14
  • 打赏
  • 举报
回复
堆上分配的就简单了,直接用int **p,和int col, int row三个参数来获得数组的首地址和行列数,取的时候直接p[i][j],只要i,j小于等于col-1和row-1,不发生下标越界访问就行了。

________________________________________________________________________________

就是说如果是栈上的二维数组在传参数的时候需要给定第二维的长度,而如果是堆上分配的就只需要**咯?
jixingzhong 2006-07-14
  • 打赏
  • 举报
回复
#include<conio.h>
#include<stdio.h>

/*函数输出数组内容*/
void print(int a[][10], int row) /*参数中说明第二维长度,并传入第一维长度row*/
{
int x, y;
for(x=0; x<row; x++)
{
for(y=0; y<10; y++)
printf("%-5d", a[x][y]);
printf("\n");
}
}

int main(){
int arr[5][10];
int i, j;

for(i=0; i<5; i++)
for(j=0; j<10; j++)
arr[i][j] = i+j; /*赋值*/
print(arr, 5); /*数组传递, 第一维长度也作为参数传递*/
getch();
return 0;
}
triace_zhang 2006-07-14
  • 打赏
  • 举报
回复
堆上分配的就简单了,直接用int **p,和int col, int row三个参数来获得数组的首地址和行列数,取的时候直接p[i][j],只要i,j小于等于col-1和row-1,不发生下标越界访问就行了。
CrazyDogHH3 2006-07-14
  • 打赏
  • 举报
回复
那如果要传递的是一个堆上分配的二维数组应该怎么传呢?~
113A 2006-07-14
  • 打赏
  • 举报
回复
汗,回的好快,我回的时候A_B_C_ABC(黄瓜)刚说完了,结果现在这么多楼了……
113A 2006-07-14
  • 打赏
  • 举报
回复
楼上的写法是可以的。int **不可以是因为int **是在内存里面实际上是树形的,int **指向一组int *,int *再去指向一组int。而int a[2][2]在内存分布实际上是一维线性的。用int *可以指向,你可以尝试遍历一下。
gobbyhan 2006-07-14
  • 打赏
  • 举报
回复
c八二维当一维处理都是一样的
OOPhaisky 2006-07-14
  • 打赏
  • 举报
回复
对于多维数组作为参数,除第一维之外的其它维必须指定维数,否则是肯定编译不过去的。
triace_zhang 2006-07-14
  • 打赏
  • 举报
回复
因为栈上分配的数组和堆上分配的数组在内存排列上可能不相同。栈上:
int ia[2][2] = {2,3,4,5}; //4个元素是连续排列的内存段
堆上:
int **p = new int*[2]; //只有每行内是连续排列,各行并不一定连续排列
for ( int i = 0; i < 2; i++ )
{
p[i] = new int[2];
}
for ( int i = 0; i < 2; i++ )
{
for ( int j = 0; j < 2; j++ )
{
p[i][j] = ia[i][j];
}
}

所以对栈上的数组用int **p指向首地址,因为int **p一次解引用为地址指针,而非堆上的指向数组的指针,所以二次解引用会出错。
如果找一个通用方程只能用:
void f( int *p, int row, int col ) //给出数组的行和列,对堆上的数组不合适
{
for ( int i = 0; i < row; i++ )
{
for ( int j = 0; j < col; j++ )
{
cout << p[i * row + j] << " ";
}
cout << endl;
}
}

int main(){
//.........
int ia[2][2] = {2,3,4,5};
f( (int*)ia, 2, 2 );
}
du51 2006-07-14
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
void show(int arr[][3],int m,int n)
{
int i,j;
for(i=0;i<m;++i)
{
for(j=0;j<n;++j)
{
printf("%d ",arr[i][j]);
}
}
}

int main()
{
int arr[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
show(arr,5,3);
system("PAUSE");
return 0;
}
lyskyly 2006-07-14
  • 打赏
  • 举报
回复
const int N = 4;

void Fun1(int (*a)[N])
{
}

void Fun2(int a[][N])
{
}

int main()
{
int a[N][N];
Fun1(a);
Fun2(a);
}
0黄瓜0 2006-07-14
  • 打赏
  • 举报
回复
数组的维数是确定的那就简单:
void A(int a[2][2])
{
int i,k;
for( i=0;i<2;++i)
{
for( k=0;k<2;k++)
{
a[i][k]=(i+k)*2;
}
}
for( i=0;i<2;++i)
{
for( k=0;k<2;k++)
{
cout<< a[i][k]<<endl;;
}
}
cout<<endl;
}
int main()
{
int a[2][2];
A(a);
return 0;
}
ckp 2006-07-14
  • 打赏
  • 举报
回复
可以啊
fallinleave 2006-07-14
  • 打赏
  • 举报
回复
为什么不行呢?肯定行的
所谓的数组名其实就是一个指针

64,701

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧