gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:50:36 27 4
gpt4 key购买 nike

例如,我想将一个二维整数数组传递给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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com