【问题标题】:Difference between passing arrays to functions as func(int * arr[][]) and func(int arr[][])?将数组传递给函数 func(int * arr[][]) 和 func(int arr[][]) 之间的区别?
【发布时间】:2020-06-04 17:59:00
【问题描述】:

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

另外,我在 GNU GCC 编译器(Windows 10)中收到一条警告:

警告:从不兼容的指针类型 [-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[][]”的函数的结果是:
第一行:11
第二行:6
采用“int * arr[][]”的函数的结果是:
第一行:26
第二行:12

能否请您帮助我了解其中的区别以及如何删除该警告?

【问题讨论】:

  • int arr[][]int 的二维数组。 int * arr[][] 是一个二维指针数组。它们完全不同。

标签: c arrays function pointers


【解决方案1】:

int arr[R][C]int 的二维数组。
int * arr[R][C]int* 指针的二维数组,考虑到该函数的实现方式,这没有任何意义。

不幸的是,gcc 在默认模式下对您没有任何帮助,它不会因违反 C 语言而给出错误,只是警告。因为addRow2(arr); 不是有效的C,如果非C 模式下的编译器无论如何都吐出二进制文件会发生什么,这是任何人的猜测。

可能你从addRow2 得到的奇怪输出可以解释为它以某种方式为你提供了 64 位块,但研究它并没有什么有趣的东西可以学习,因为它是一个格式错误的程序。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 2021-09-16
    • 2011-07-26
    • 1970-01-01
    • 2010-09-16
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多