将数组传递给函数的区别是func(int * arr [] [])和func(int arr [] []?

问题描述 投票:0回答:1

我在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

您能帮我理解不同之处以及如何删除该警告吗?

我在Google上对此进行了一些搜索,发现它们没有什么区别,但是我有以下代码,其中有两个函数添加矩阵行,每种类型一个,它们给我...] >

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

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

[可能解释了addRow2的奇怪输出,它以某种方式为您提供了64位块,但是由于它是一个格式错误的程序,因此对其进行研究并没有什么值得学习的知识。

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

c arrays function pointers
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.