C++ 中将二维数组传入函数

C++ 中将二维数组传入函数

主要有三种方式
void fun(int *a[],int m,int n)//**a
void fun2(int a[][2],int m)//a[2][2]
void fun3(int (*a)[2],int m,int n)//a[2][2];int (*p)[2];p=a;

//c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下:

//方法一, 形参给出第二维的长度。

#include <stdio.h>

void func(int n, char str[][5])
{
           int i;
           for (i = 0; i < n; i++)
           {
                   printf("\nstr[%d] = %s\n", i, str[i]);
           }
}

void main()
{
           char str[][5] = {"abc", "def", "ghi"};
           func(3, str);
}


//方法二,形参声明为指向数组的指针。

#include <stdio.h>

void func(int n, char (*str)[5])
{
           int i;
           for (i = 0; i < n; i++)
           {
                   printf("\nstr[%d] = %s\n", i, str[i]);
           }
}

void main()
{
           char str[][5] = {"abc", "def", "ghi"};
           func(3, str);
}


//方法三,形参声明为指针的指针。

#include <stdio.h>

void func(int n, char **str)
{
           int i;
           for (i = 0; i < n; i++)
           {
                   printf("\nstr[%d] = %s\n", i, str[i]);
           }
}

void main()
{
           char *p[3];
           char str[][5] = {"abc", "def", "ghi"};
           p[0] = &str[0][0];
           p[1] = str[1];
           p[2] = str[2];
           func(3, p);
}

第2个第3个都可以运行的,我在VC 6测试通过的,
第2个是数组指针,就是指向一个大小固定的数组的指针,第3个是指针的指针
***************
数组与指针有点复杂,这有个例子大家自己测试一下或许就理解了
fun1(int m[2][3][5]){;}//编译器认为是int(*m)[3][5],m是一个指向int[3][5]的指针
fun2(int m[][3][5]){;}/*同上,不信你这样测试int t[3][3][5];fun1(t);你或许会惊讶它竟然能编译通过,我也不敢相信自己的眼睛*/
fun3(int (*m)[3][5]){;}//编译器认为它是int (*m)[3][5],数组的指针是不退化的
fun4(int **m){;}
//测试一
int t[2][3][5];
fun1(t);
fun2(t);
fun3(t);
//测试二
int (*p)[3][5]=t;
fun1(p);
fun2(p);
fun3(p);
//测试三
int (*q)[2][3][5]=&t;
fun1(*q);
fun2(*q);
fun3(*q);
//测试四
int h[5][3];
int *i[5];
int **j;
int ***k;
//fun4(h);通不过编译
fun4(i);
fun4(j);
//fun4(*k);报错
//有时自己都认为指针和数组是相同的了,但它们确实有很多差别的

***********

数组与指针是怎样被编译器修改的(出自<<C专家编程>>)
ANSI C规则  
1:表达式中的数组名就是指针  
2:下标总是与指针的偏移量相同  
3:在函数参数的声明中,数组名被当作指向该数组第一个元素的指针
                 实参                形参
数组的数组      char[8][10]         char(*)[10]        数组指针
指针数组        char *c[15]         char **c           指针的指针
数组指针        char (*c)[64]       char (*c)[64]       不变
指针的指针      char **c            char **c            不变
***************
void average( int ary[12] );     // 形参ary是一个int *
...
int anArray[] = { 1, 2, 3 };     // 一个具有个元素的数组
const int anArraySize = sizeof(anArray)/sizeof(anArray[0]);     // == 3
average( anArray );   // 合法

void average( int ary[] );   // 形参ary仍然是一个int *
****************
如果数组边界的精确数值非常重要,并且希望函数只接受含有特定数量的元素的数组,可以考虑使用一个引用形参:
void average( int (&ary)[12] );
现在函数就只能接受大小为12的整型数组:
average( anArray );   // 错误!anArray是一个int [3]!

************
int *anArray2 = new int[anArraySize];
average( anArray2 ); // 错误!不可以使用int *初始化int (&)[n]
average_n( anArray, anArraySize ); // 没问题

*************
多维数组形参并不比一维数组来得困难,但它们看上去更具挑战性
void process( int ary[10][20] );
和一维数组的情形一样,形参不是一个数组,而是一个指向数组首元素的指针。不过,多维数组是数组的数组,因此形参是一个指向数组的指针
void process( int (*ary)[20] );// 一个指针,指向一个具有20个int元素的数组
void process( int ary[][20] );   // 仍然是一个指针,但更清晰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值