Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过类型转换使用指针到指针在c中传递2d数组_C_Arrays_Pointers_Multidimensional Array - Fatal编程技术网

通过类型转换使用指针到指针在c中传递2d数组

通过类型转换使用指针到指针在c中传递2d数组,c,arrays,pointers,multidimensional-array,C,Arrays,Pointers,Multidimensional Array,我正在搜索将2d数组传递给c中的函数,我发现了上面的站点。我了解传递2d数组的第一种和第二种方法,但我得到了 在第三种方法中感到困惑,具体来说,它是如何以这种方式工作的` 3) Using an array of pointers or double pointer In this method also, we must typecast the 2D array when passing to function. #include <stdio.h> // Sam

我正在搜索将2d数组传递给c中的函数,我发现了上面的站点。我了解传递2d数组的第一种和第二种方法,但我得到了 在第三种方法中感到困惑,具体来说,它是如何以这种方式工作的`

3) Using an array of pointers or double pointer
In this method also, we must typecast the 2D array when passing to function.
    #include <stdio.h>
    // Same as "void print(int **arr, int m, int n)"
    void print(int *arr[], int m, int n)
    {
        int i, j;
        for (i = 0; i < m; i++)
          for (j = 0; j < n; j++)
            printf("%d ", *((arr+i*n) + j));
    }

    int main()
    {
        int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        int m = 3;
        int n = 3;
        print((int **)arr, m, n);
        return 0;
    }
    Output:

    1 2 3 4 5 6 7 8 9
`


第二个方法和第三个方法仅在print()函数中传递的参数类型不同,而其余代码相同。那么函数的工作方式之间的实际区别是什么呢?

传递2D数组的最简单方法

作用

void PrintArray(unsigned char mat[][4]){
    int i, j;
    printf("\n");
    for(i = 0;i<4;i++){
        for(j = 0;j<4;j++)
                printf("%3x",mat[i][j]);

        printf("\n");
    }
    printf("\n");
}
void printary(无符号字符mat[][4]){
int i,j;
printf(“\n”);

对于(i=0;i)两个例子都非常不正确,因为它们将一个对象解释为不同的不兼容对象。这会导致未定义的行为。对它们所做的事情进行推理是没有意义的,而是要找到一个正确的例子。@2501但是为什么它们给出了正确的输出?你说的是什么意思“对象作为另一个不兼容的对象”?Geeks for Geeks文章末尾说(结尾):最后,我们可能会明确指出,如果我们将多维数组传递给函数[…]我们不能将该函数声明为接受指向指针的指针。文章中的注释还指出第三种方法是错误的。变量
int arr[][3]
infact占用了一个连续的内存区域,arr指向它的开始。这就是为什么单解引用可以工作的原因。就像你在
{1,2,3},{4,5,6},{7,8,9}中写的那样,你的二维数组是单维的
显然,这是因为它实际上并没有将其参数用作它所需的指针数组。更准确地说,它并没有尝试去引用“指针”“在数组中,它只显示它们。使用
%d
格式说明符。简言之,在这一体系结构上,一大堆错误最终会变成正确的。在64位非ILP64平台上,它可能会失败。”。
void PrintArray(unsigned char mat[][4]){
    int i, j;
    printf("\n");
    for(i = 0;i<4;i++){
        for(j = 0;j<4;j++)
                printf("%3x",mat[i][j]);

        printf("\n");
    }
    printf("\n");
}
int main(){

int i,j;
//static int c=175;
unsigned char  state[4][4], key[4][4], expandedKey[176];


printf("enter the value to be decrypted");
for(i=0;i<4;i++)
    for(j=0;j<4;j++)
        scanf("%x",(unsigned int *)&state[j][i]);
PrintArray(state);

return 0;
}