gpt4 book ai didi

c - 二维数组和函数

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:32 25 4
gpt4 key购买 nike

根据这个https://stackoverflow.com/a/3912959/1814023我们可以声明一个接受二维数组的函数

void func(int array[ROWS][COLS]).

根据这个,http://c-faq.com/aryptr/pass2dary.html他们说“由于被调用函数不为数组分配空间,它不需要知道整体大小,所以行数,NROWS,可以省略。数组的宽度仍然很重要,所以必须保留列维度 NCOLUMNS(对于三维或更多维数组,中间维度)。

我试过了,效果很好...请注意,我已经更改了列的大小。

#include <stdio.h>
#define ROWS 4
#define COLS 5

void func1(int myArray[][25])
{
int i, j;

for (i=0; i<ROWS; i++)
{
for (j=0; j<COLS; j++)
{
myArray[i][j] = i*j;
printf("%d\t",myArray[i][j]);
}
printf("\n");
}
}

int main(void)
{
int x[ROWS][COLS] = {0};
func1(x);
getch();
return 0;
}

我的问题是,为什么在 CFAQ 链接(http://c-faq.com/aryptr/pass2dary.html)中他们说“数组的宽度仍然很重要”?即使我提供了错误的列大小。有人可以解释一下吗?

最佳答案

这就是您使用数组表示法表示指针的结果。人为的例子:

#include <stdio.h>

void size(int myArray[][25], int rows, int cols)
{
printf("sizeof(int [%d][%d]) = %d\n", rows, cols, sizeof(myArray));
}

int main(void)
{
int arr1[4][4];
int arr2[4][5];
int arr3[5][5];

size(arr1, 4, 4);
size(arr2, 4, 5);
size(arr3, 5, 5);

printf("sizeof(int *) = %d\n", sizeof(int *));

return 0;
}

如果您尝试运行它,所有 4 个大小都将相同,即使传递的数组大小不同。
C 中的数组类型只是语法糖——多维数组在线性内存模型中毫无意义。使用线性内存模型访问简单数组的元素,您必须知道两件事:基地址和索引偏移量,因此您可以编写 *(base+indexOffset)。要索引二维数组中的元素,您必须知道另外两件事:第一个维度的大小及其偏移量,因此您可以编写 *(base+dimensionSize*dimensionOffset+indexOffset)。数组符号只是为您完成所有这些复杂的数学运算,但您仍然必须向编译器提供所需的数据。由您来确保数据完整性:)

关于c - 二维数组和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19589193/

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