二维数组传值问题? 各位高手帮忙看看!!!

Coder-zhw 2009-10-27 11:28:35
二维数组 在函数中怎么传递???

函数中声明 形参 为char** 在 传值时传给他一个二维数组的指针 为何不可?

如函数定义为fun(char** a){}

定义二维数组 char a[4][4]

调用函数 fun(a); 为何不可?

如下程序



#include<iostream>
using namespace std;
void fun(int,int,int**);
int main()
{

int a[4][5]={0};
fun(4,5,a);

return 0;
}

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

...全文
204 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
notax 2009-10-28
  • 打赏
  • 举报
回复
不知到这个行不行

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

#define NUM_ROW 4
#define NUM_COL 5

void show(int array[NUM_ROW][NUM_COL]) ;

int main()
{
int a[4][5]={0};

show(a);

return EXIT_SUCCESS;
}

void show(int array[NUM_ROW][NUM_COL])
{
int i, j;

for(i=0; i<NUM_ROW; i++) {
for(j=0; j<NUM_COL; j++) {
printf("%d ", array[i][j]);
}
printf("\n");
}
}
飞天御剑流 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 edward9092 的回复:]
引用 6 楼 supermegaboy 的回复:


void fun( int m, int n, void *a )




还有请问一下 这里的 void *a 参数是什么意思呢?

谢谢啦..
[/Quote]

由于n是通过实参传递的,那么a所指向的数组对象的大小就不重要了,只需要获得实参数组的首地址就行了,使用void*可以无须理会实参数组的大小。
飞天御剑流 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 edward9092 的回复:]
引用 6 楼 supermegaboy 的回复:

int **p = new int*[m];




为什么 这里 动态分配的二维数组时 二级指针.

而 系统给我们定义的确是 一级指针呢?


[/Quote]

动态数组虽然也叫数组,但跟C/C++对象模型中的数组对象是两回事,具有连续存储空间的动态数组只在内存映像上跟数组对象类似,其它特性根本不同。动态数组利用指针重构各元素的首地址。
Coder-zhw 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 supermegaboy 的回复:]


void fun( int m, int n, void *a )


[/Quote]

还有请问一下 这里的 void *a 参数是什么意思呢?

谢谢啦..
Coder-zhw 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 supermegaboy 的回复:]

int **p = new int*[m];


[/Quote]

为什么 这里 动态分配的二维数组时 二级指针.

而 系统给我们定义的确是 一级指针呢?

飞天御剑流 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 edward9092 的回复:]
好像书上  对 二维数组的操作 都是用二级指针啊?

引用 3 楼 supermegaboy 的回复:
二维数组不是二级指针,与二维数组int[4][5]等效的指针是这样的:int(*)[5]

void fun( int, int, int(*)[5] );
..........
void fun( int m, int n, int(*)[5] )
{
    .....
}


这样传值,如果我不知道 数组的维数,该怎么办呢??



[/Quote]

可以用动态数组,这时候只需要传a的地址进去就行了,在fun内部重构数组


#include<iostream>

void fun( int, int, void* );

int main( void )
{
int a[4][5];
for( int i = 0; i < 4; ++i )
for( int j = 0; j < 5; ++j )
a[i][j] = j;
fun(4,5,a);
return 0;
}

void fun( int m, int n, void *a )
{
int **p = new int*[m];
for( int i = 0; i < m; ++i )
p[i] = ( int* )a + i * n;
for(int i = 0; i < m; ++i )
for( int j = 0; j < n; ++j )
std::cout << p[i][j] << " " << std::endl;
}


嫌麻烦,就用C++标准库的vector。
机智的呆呆 2009-10-27
  • 打赏
  • 举报
回复
char**和char a[][]的内存布局是不一样的。
Coder-zhw 2009-10-27
  • 打赏
  • 举报
回复
好像书上 对 二维数组的操作 都是用二级指针啊?

[Quote=引用 3 楼 supermegaboy 的回复:]
二维数组不是二级指针,与二维数组int[4][5]等效的指针是这样的:int(*)[5]

void fun( int, int, int(*)[5] );
..........
void fun( int m, int n, int(*)[5] )
{
    .....
}
[/Quote]

这样传值,如果我不知道 数组的维数,该怎么办呢??


飞天御剑流 2009-10-27
  • 打赏
  • 举报
回复
二维数组不是二级指针,与二维数组int[4][5]等效的指针是这样的:int(*)[5]

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

lingyin55 2009-10-27
  • 打赏
  • 举报
回复
参考
http://www.programfan.com/club/showpost.asp?id=130266&t=o
jackyjkchen 2009-10-27
  • 打赏
  • 举报
回复
二维数组的寻址级别实际上是一级指针

65,189

社区成员

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

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