c - int[ ][ ] 和 int** 有什么区别(菜鸟)

标签 c arrays

例如,我想将一个二维整数数组传递给C中的函数。该函数是否应该定义为

void foo(int**,int m,int n);

void foo(int[][],int m,int n);

我在第一个原型(prototype)声明中遇到错误,但在使用 GCC 编译时收到警告“不兼容的指针类型”。请解释如何传递二维数组。主要方法如给出

int main()  
{  
    int m,n;  
    scanf("%d%d",&m,&n); 
    int a[m][n];  
    foo(a,m,n);  
    return 0;  
}  

最佳答案

两个函数声明

void foo(int**,int m,int n);

void foo(int[][],int m,int n);

是错误的。具有数组类型的参数的声明被调整为指向元素类型的指针。因此,如果您有一个具有二维数组类型的参数声明,如下所示

int a[M][N]

然后调整为

int ( *p )[N}

对于函数定义,N 的值必须已知。如果 N 是声明的编译时常量,例如

#define N 10

那么函数声明可以是这样的

void foo( int[][N], int );

void foo( int[][N], size_t );

其中第二个参数指定“行”数。 “列”的数量是已知的,因为正如我所说,它是一个编译时常量。

如果 N 在运行时计算并且编译器支持可变长度数组,那么您应该声明如下函数

void foo( int, int, int[*][*] );

或者,最好使用 size_t 类型来代替尺寸的 int 类型。例如

void foo( size_t, size_t, int[*][*] );

请考虑到至少第二个参数必须位于数组的声明之前,因为它用于确定数组的元素类型(其大小应为函数定义所知)。

对于不是其定义的函数声明,不需要参数名称。

这里显示了如何使用可变长度数组表示法来声明和定义函数。

#include <stdio.h>

void foo( size_t, size_t, int[*][*] );

void foo( size_t m, size_t n, int a[m][n] )
{
    for ( size_t i = 0; i < m; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) printf( "%d ", a[i][j] );
        putchar( '\n' );
    }
}

#define M   2
#define N   3

int main(void) 
{
    int a[M][N] =
    {
        { 1, 2, 3 },
        { 4, 5, 6 }
    };

    foo( M, N, a );

    size_t m = 3;
    size_t n = 2;

    int b[m][n];

    for ( size_t i = 0; i < M; i++ )
    {
        for ( size_t j = 0; j < N; j++ ) b[j][i] = a[i][j];
    }

    putchar( '\n' );

    foo( m, n, b );

    return 0;
}

程序输出为

1 2 3 
4 5 6 

1 4 
2 5 
3 6 

第三个参数也可以这样声明

void foo( size_t m, size_t n, int a[][n] )

void foo( size_t m, size_t n, int ( *a )[n] )

因为正如所指出的,数组被调整为指向其元素类型的指针。

关于c - int[ ][ ] 和 int** 有什么区别(菜鸟),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43028052/

相关文章:

计算最多 18 位的素数优化

java - 按降序对整数数组进行排序并将其与相应的字符串数组相关联

java - 使用 equals 方法比较两个对象,Java

arrays - 动态数组json解析

c - while循环初始化错误

c - C 中的(空)无限循环是否未定义行为?

c - 如何在 pcap 中捕获数据包,并跳过以太网 header

将 SIGNED 分数转换为 UNSIGNED 定点以进行加法和乘法

arrays - 这个使用范围的简单 For 循环如何以及为什么在 Go 中打印一个简单的 3D 数组?

c# - 获取指定范围内数组中元素计数的方法