将数组传递给函数作为func(int*arr[][])和func(int-arr[][])之间的区别?

将数组传递给函数作为func(int*arr[][])和func(int-arr[][])之间的区别?,c,arrays,function,pointers,C,Arrays,Function,Pointers,我在google上搜索了一下,发现它们没有任何区别,但我有下面的代码,其中两个函数添加了一行矩阵,每种类型一行,它们给出了不同的答案 此外,我在GNU GCC编译器(windows 10)中收到一条警告,上面说: 警告:从不兼容的指针类型[-Wincompatible指针类型]传递'addRow'的参数1| #包括 #包括 #定义r2 #定义C2 无效地址行(内部地址[R][C]); void addRow2(int*arr[R][C]); 无效打印阵列(内部阵列[R][C]); int mai

我在google上搜索了一下,发现它们没有任何区别,但我有下面的代码,其中两个函数添加了一行矩阵,每种类型一行,它们给出了不同的答案

此外,我在GNU GCC编译器(windows 10)中收到一条警告,上面说:

警告:从不兼容的指针类型[-Wincompatible指针类型]传递'addRow'的参数1|

#包括
#包括
#定义r2
#定义C2
无效地址行(内部地址[R][C]);
void addRow2(int*arr[R][C]);
无效打印阵列(内部阵列[R][C]);
int main()
{
国际航空公司[R][C];
对于(int i=0;i
当我们为第一行输入5和6,为第二行输入2和4时:
函数获取“int arr[][]”的结果是:
第一行:11
第二排:6
函数取“int*arr[][]”的结果是:
第一排:26
第二排:12


你能帮我理解其中的区别以及如何删除该警告吗?

int-arr[R][C]
是一个由
int
组成的二维数组
int*arr[R][C]
是一个由
int*
指针组成的2D数组,考虑到该函数是如何实现的,它没有任何意义

不幸的是,在默认模式下,gcc并没有给您任何好处,在默认模式下,它不会给出来自C语言冲突的错误,只是警告。因为
addRow2(arr)
不是有效的C,如果编译器在非C模式下抛出一个二进制文件,会发生什么,这是任何人的猜测

也许你从
addRow2
中奇怪的输出可以解释为它以某种方式给了你64位的块,但是研究它没有什么有趣的地方,因为它是一个格式不正确的程序


如果要阻止无效的C进行编译,请使用
-pedantic errors
进行编译。

int-arr[R][C]
int
的2D数组
int*arr[R][C]
是一个由
int*
指针组成的2D数组,考虑到该函数是如何实现的,它没有任何意义

不幸的是,在默认模式下,gcc并没有给您任何好处,在默认模式下,它不会给出来自C语言冲突的错误,只是警告。因为
addRow2(arr)
不是有效的C,如果编译器在非C模式下抛出一个二进制文件,会发生什么,这是任何人的猜测

也许你从
addRow2
中奇怪的输出可以解释为它以某种方式给了你64位的块,但是研究它没有什么有趣的地方,因为它是一个格式不正确的程序


如果要阻止编译无效的C,请使用
-pedantic errors
编译。

int-arr[][]
int
的2D数组
int*arr[][]
是一个二维指针数组。它们完全不同。
int-arr[][]
int
的二维数组
int*arr[][]
是一个二维指针数组。他们完全不同。
#include <stdio.h>
#include <stdlib.h>

#define R 2
#define C 2

void addRow(int arr[R][C]);
void addRow2(int * arr[R][C]);
void printArr(int arr[R][C]);

int main()
{
    int arr[R][C];
    for(int i = 0; i < R; i++) {
        for(int k = 0; k < C; k++) {
            printf("Enter %d-th row %d-th element:", i+1, k+1);
            scanf(" %d", &arr[i][k]);
        }
    }
    printArr(arr);
    addRow(arr); // prints 11 and 6
    addRow2(arr); // prints 26 and 12

    return 0;
} /* =============== Main ================= */

/* Function that takes "int arr[][]" */
void addRow(int arr[R][C]) {

    for(int j = 0; j < R; j++) {
        int rowSum = 0;
        for(int l = 0; l < C; l++) {
            rowSum += arr[j][l];
        }
        printf("Sum of %d-th row = %d\n", j+1, rowSum);
    }
}

/* Function that takes "int * arr[][]" */
void addRow2(int * arr[R][C]) {

    for(int j = 0; j < R; j++) {
        int rowSum = 0;
        for(int l = 0; l < C; l++) {
            rowSum += arr[j][l];
        }
        printf("Sum of %d-th row = %d\n", j+1, rowSum);
    }
}