C语言 我可以在函数中使用矩阵而不指定ROWS吗?

rggaifut  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(120)

在为我的一个练习编写一个相当简单的代码时,我遇到了这个问题。这个练习要求我创建一个函数(它做什么并不重要,但它会遍历矩阵的每个元素来做一些事情),以一个二维数组(NxM)和一个双精度型(在函数中使用)作为参数。函数看起来如下:

int function(int (*myarray)[M], double y){}

现在,如果我没有遗漏任何内容,这是不够的,因为如果不使用值N作为range,我就无法循环遍历元素。我说的对吗?如果不将行数作为参数传递,就无法使用该函数中的行数,这意味着本练习理所当然地认为传递矩阵意味着也要传递N(行)作为参数。
(我曾考虑过使用sizeof来获取行数,但函数(){}中的sizeof(myarray)并不像预期的那样工作。该函数中的myarray与我在main()中声明的原始myarray有什么区别?)
myarray被声明为int myarray[N][M];,然后用一个包含myarray[i][j] = rand()%(max-min+1)+min;的循环初始化。我不认为这与问题太相关,但我包括它是为了解释它是自动分配的。
我已经检查了一些类似的讨论,如thisthis,但由于每个人都给出了尺寸作为参数,我还没有找到答案。

nbysray5

nbysray51#

我可以在函数中使用矩阵而不指定ROWS吗?”
答案基本上是否定的。函数必须有某种方式知道要使用数组中的多少数据。这不一定是数组的原始大小;它可以是调用者希望函数操作的数组的数量或数组的一部分。C标准没有提供任何从指针知道数组原始大小的方法。
该信息可以通过多种方式提供给函数:参数、外部变量,包括标记值。
如果我没有遗漏任何东西,这是不够的,因为如果不使用值N作为范围,我就不能遍历元素,对吗?
传递数组中的行数是一种能够遍历它们的方法。可以通过其他方式提供信息。在您的环境中,传递行数可能是您想要的方法。
这个函数中的myarray和我在main()中声明的原始myarray有什么区别?)
当函数参数声明为数组时,会自动调整为指针,因此如果参数声明为int myarray[N][M],则会自动调整为int (*myarray)[M],则函数中的myarray不是数组;它是指针。
当数组作为参数传递给函数时,它会自动转换为指向其第一个元素的指针。每当在表达式中使用数组时(作为sizeof的操作数或unary &的操作数或用于初始化数组的字符串文字时除外),都会发生这种自动转换。

相关问题