int arr[R][C]
是int
的2D数组。int * arr[R][C]
是int*
指针的2D数组,考虑到该函数的实现方式,这没有任何意义。
我在Google上对此进行了一些搜索,发现它们没有什么区别,但是我有以下代码,其中有两个函数添加矩阵行,每种类型一个,并且它们给我不同的答案。] >
[另外,我在GNU GCC编译器(Windows 10)中收到一条警告:
第一行:11第二行:6函数取“ int * arr [] []”的结果是:第一行:26第二行:12警告:从不兼容的指针类型[-Wincompatible-pointer-types]中传递'addRow'的参数1]]
#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); } }
[当我们在第一行中输入5和6,在第二行中输入2和4时:函数取“ int arr [] []的结果是:
您能帮我理解不同之处以及如何删除该警告吗?
我在Google上对此进行了一些搜索,发现它们没有什么区别,但是我有以下代码,其中有两个函数添加矩阵行,每种类型一个,它们给我...] >
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[R][C]
是int
的2D数组。int * arr[R][C]
是int*
指针的2D数组,考虑到该函数的实现方式,这没有任何意义。