[英]Passing 2D arrays in C like argv of main
我正在学习将2D数组传递给C语言中的函数,并了解到可以在函数中接收2D数组,如下所示:
void test(char a[5][10])
void test(char (*a)[10])
上面的声明对我有用,但是在查看**argv
函数的**argv
参数时,我想到了将函数更改为void test(char **a)
。 但这不能正常工作。 我不懂为什么。 请解释。
这是我的代码
#include<stdio.h>
int main(int argc, char **argv){
char multi[5][10] = {
{'0','0','2','3','4','5','6','7','1','9'},
{'a','b','c','d','e','f','g','h','i','j'},
{'A','B','C','D','E','F','G','H','I','J'},
{'9','8','7','6','5','4','3','2','1','0'},
{'J','I','H','G','F','E','D','C','B','A'}
};
test(multi);
return 0;
}
void test(char (*a)[10]) // void test(char **a) does not work
{
printf("\n a[2][1] is: %d",*(*(a + 2)+1));
}
数组名称传递给函数时,将衰减为其第一个元素的地址值,其类型将是指向该元素类型的指针。 由于multi[0]
的类型是char[10]
,所以multi
将衰减pointer to char[10]
。
main()
在第二个参数中接收到一个指向char
的指针数组,这就是为什么argv
可以为char **argv
或char *argv[]
。
对于多维数组,行存储在连续的内存位置中。 这就是为什么我们需要传递列数,即计算要跳转到特定行的项目数。
如果使用指针,则将行存储在任意存储位置中。 给定第一行的指针和索引,就找不到行的位置。 在这种情况下,您需要的指针与行数一样多。
简而言之,函数参数的两个版本采用不同的内存布局,因此它们是不兼容的。
C语言中的数组本质上是一维的。 当传递多维数组时,您应该传递除第一个维数以外的所有维数大小作为常量整数。 并且数组作为指针而不是数组传入。 这是一种替代方法:传递一维或多维指针以及尺寸大小。 例如:void test(char * a,int row,int column); 索引是:column * i + j; 或:void测试(char ** a,int行,int列);或者
char(* a)[10]是指向字符数组的指针。 操作(a + 1)将a的值增加10个字节。
char ** a是双指针。 在这种情况下,运算(a + 1)将使a的值增加4个字节。 因此,以下陈述将导致错误的行为。
printf(“ \\ na [2] [1]是:%d”,*(*(a + 2)+1));
这不是一个正式的解释,而是我的理解方式:数组实际上是线性存储在内存中的。 例如,您定义10x10数组并执行b=a[4][5]
,系统将在内存中查找第4*10+5=45
个元素。 这就是为什么您不能传递**a
并将其作为2D数组访问的原因。 它是没有尺寸信息的指针。 使用a[4][5]
,程序将查找第4*(number of columns)+5
第4*(number of columns)+5
个元素。 由于它不知道一行中有多少个元素,因此无法做到这一点。
你总是可以做这样的事情
#include<stdio.h>
#include<stdlib.h>
void test(char **a);
int main(int argc, char **argv){
char **multi = (char**) malloc (5*sizeof(char*));
char a[5][10] = {{'0','0','2','3','4','5','6','7','1','9'}, {'a','b','c','d','e','f','g','h','i','j'}, {'A','B','C','D','E','F','G','H','I','J'}, {'9','8','7','6','5','4','3','2','1','0'}, {'J','I','H','G','F','E','D','C','B','A'}};
int i,j;
for(i=0;i<5;i++)
{
multi[i] = (char*) malloc (10*sizeof(char));
}
for(i = 0;i<5;i++)
{
for(j = 0; j < 10 ;j++)
{
multi[i][j] = a[i][j];
}
}
test(multi);
return 0;
}
void test(char **a) // void test(char **a) does not work
{
printf("\n a[2][1] is: %c\n",*(*(a + 2)+1));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.