主要有三种方式
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] ); // 仍然是一个指针,但更清晰