繁体   English   中英

在C中传递2D数组,例如main的argv

[英]Passing 2D arrays in C like argv of main

我正在学习将2D数组传递给C语言中的函数,并了解到可以在函数中接收2D数组,如下所示:

  1. void test(char a[5][10])
  2. 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 **argvchar *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)+54*(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM