【问题标题】:Array lengths in array parameters数组参数中的数组长度
【发布时间】:2015-07-05 21:09:15
【问题描述】:

我正在阅读 K.N.King 的 C Programming: A Modern Approach 来学习 C 编程语言,当前章节讲述了函数以及数组参数。说明可以使用这样的结构来表示数组参数的长度:

1.

void myfunc(int a, int b, int[a], int[b], int[*]); /* prototype */

void myfunc(int a, int b, int n[a], int m[b], int c[a+b+other_func()]) {
... /* body */
}

2.

void myfunc(int[static 5]); /* prototype */

void myfunc(int a[static 5]) {
... /* body */
}

所以问题是:

a. 示例 1 中的构造纯粹是装饰性的还是它们对编译器有影响?

b. 在这种情况下,static 修饰符是否仅具有装饰性?它究竟是什么意思和作用?

c. 是不是也可以这样声明一个数组参数;和示例 1 一样美观吗?

void myfunc(int[4]);

void myfunc(int a[4]) { ... }

【问题讨论】:

  • 没人知道。做实验:)
  • @i486 请不要再撒谎了。 C语言有一个标准。当然有人知道。作为参考,用 C 做实验是个坏主意,因为每个编译器做的事情都有点不同。参考标准确定。
  • 似乎所有这些都在编译时被删除了,编译器没有进行额外的检查。括号内的表达式在运行时进行评估,但它们的值似乎丢失了。但这就是所有要说的吗?静电究竟会导致什么?

标签: c arrays function parameters static


【解决方案1】:

函数数组参数的最里面的维度总是被重写为一个指针,所以你给那里的值并不重要,不幸的是。对于多维数组,这会发生变化:从第二维开始,编译器会使用它们来计算 A[i][j] 之类的东西。

static 在该上下文中意味着调用者必须提供至少一样多的元素。大多数编译器会忽略值本身。一些最近的编译器从中推断出不允许空指针作为参数,并在可能的情况下相应地警告您。

还观察到原型可能有*,所以很明显该值在那里并不重要。在多维数组的情况下,具体值是使用定义表达式计算的值。

【讨论】:

  • 可能sizeof a会根据定义给出不同的结果。
  • @i486,你是什么意思? sizeof 只能在函数定义内部使用。指针参数的 `sizeof` 将始终返回该指针的大小,而不是它指向的数组。
  • 我的意思是sizeof可能会根据函数定义中的数组大小而有所不同。所有其他都可以相同 - 例如在func( int a[5] )func( int a[8] ) 之间。您将参数定义为数组 - 实际上它用作指针。但是sizeof a 将根据定义中的数组大小进行计算。 (不是 100% 肯定,也没有测试,只是猜测。)
  • @i486,不,指针仍然是指针,sizeof 指针永远不会告诉您它所引用的数组的大小。
  • 您的第一段不正确。数组参数的最内维总是被重写为指针,这对于多维数组不会改变。同样在同一段中,此语句-“从第二维开始,然后编译器使用它们来计算A[i][j]之类的东西”有点不清楚(至少对我而言)。
猜你喜欢
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 2011-01-01
相关资源
最近更新 更多