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

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;
}
}

...全文
200 11 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
二维数组的寻址级别实际上是一级指针
xiao0 1.c //纵向乘法表 2.c //标准乘法表 3.c //冒泡排序 4.c //验证算式正确 5.c //判断几位数 6.c //实现求二维数组的最大值 7.c //实现猜数 8.c //实现各位相加 9.c //实现求字符个数 10.c //求单词个数 xiao1 11.c //实现密码验证 12.c //实现str算法 13.c //折半法找数 14.c //递归汉诺 15.c //选择法排序 16.c //局部变量的生存期 17.c //全局变量的作用域 18.c //神奇的 i++ 19.c //预编译处理 20.c //神奇的指针 xiao.txt //刷题思路 xiao2 21.c //数组指针 22.c //出题验证系统 23.c //二维数组指针 24.c //秀秀指针 25.c //多级指针的应用 26.c //位运算 27.c //结构体变量 28.c //结构体指针 29.c //静态链表 30.c //动态链表 xiao3 31.c //共用体 32.c //文件的打开与关闭 33.c //文件的读和写 34.c //文件的块读 35.c //逆序输出 36.c //用指针的数值传递 37.c //if(0.5);if中的局部变量 38.c //指针交换地址不改原值 39.c //指针实现逆序输出 40.c //结构体传值 xiao4 41.c //结构体传数组值 42.c //结构体的各种赋值 43.c //结构体函数 44.c //结构体二维数组 45.c //学生信息管理系统 46.c //结构体函数 47.c //二维数组转一维 48.c //if(1?i>j:i问题 45.cpp //取数排列 46.cpp //全排列 47.cpp //节点 48.cpp //节点 49.cpp //村庄修公路 50.cpp //差分数组 xiao5 51.cpp //最大子段和 52.cpp //map应用 53.cpp //ASCII码排序 54.cpp //我的排序 55.cpp //隐藏的时间 56.cpp //好年份 57.cpp //最大最小值 58.cpp //由两天推日期 59.cpp //目标和 60.cpp //统计字符 xiao6 61.cpp //计算天数 62.cpp //统计单词

64,648

社区成员

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

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