维度不固定的多维数组形参笔记
在利用多维数组作为函数形参时遇到了点问题,如:
void fun(char str[][10]);
这个函数可以传入多维数组,但元素个数必须是固定的,假如传入一个str[][20],元素个数不一样的数组,那么这个函数就不适用了,且会报错。
假如我有多个元素个数都不一致的多维数组都需要调用这个函数进行处理,这个形参问题就凸显出来了,总不能创建N个不同的函数来进行处理吧?这样也太繁琐了,而且也适用度不高。
在查找了一些资料后受到了一点启发。
所有数据在存储空间里面都是有地址的,那么就可利用指针寻址来获取到相应的数据。
而这里也可利用指针来指向多维数组。
假设三维数组为:
int a[3][3]={{0,1,2},{3,4,5},{6,7,8}};
(1)用指针b表示三维数组时为:
int *b=a[0]; //将指针b指向a的首地址
三维数组中的某个元素的表示方式为:
a[i][j]=*(b+3*i+j) ; //因为二维数组也是存放在连续地址上,只需要移动指针位置就可以了,这里的3是数组的元素个数
现在开始将这个多维数组作为形参传递给fun函数,则可以如下适用:
#include <stdio.h>
#include <math.h>
#include <string.h>
//b 为指针
//x 为数组维度
//y 为数组元素个数
void fun2(char *b,int x,int y)
{
int i;
for (i=0;i<x;i++)
printf("str[%d]=%s\r\n",i,(b+y*i));
printf("str[1][3]=%c\r\n",*(b+y*1+3));
}
int main()
{
int i;
char str[3][10];
sprintf(str[0],"123456");
sprintf(str[1],"654a210");
sprintf(str[2],"asdfghjkl");
char *b=str[0];
printf("fun2(b,3,10);\r\n");
fun2(b,3,10);
char str2[5][20];
sprintf(str2[0],"1234561000");
sprintf(str2[1],"654d21045678");
sprintf(str2[2],"zxcvbnmqwertrt");
sprintf(str2[3],"zxcvbnmqwertrt");
sprintf(str2[4],"zxcvbnmqwertrt");
char *c=str2[0];
printf("fun2(c,5,20);\r\n");
fun2(c,5,20);
}
运行结果: