【发布时间】:2015-09-15 12:29:05
【问题描述】:
在 C 中,可以使用以下构造 typedef 一个数组:
typedef int table_t[N];
这里,table_t 现在定义为 N 个 int 的数组。任何声明的变量,例如table_t t;,现在都将表现为int 的普通数组。
这种构造的重点是用作函数中的参数类型,例如:
int doSomething(table_t t);
一个相对等价的函数原型可能是:
int doSomething(int* t);
第一个构造的优点是它强制N 作为表的大小。在许多情况下,强制执行此属性比依靠程序员正确计算出此条件更安全。
现在一切都好了,只是为了保证table的内容不会被修改,必须使用const限定符。
下面的说法比较容易理解:
int doSomething(const int* t);
现在,doSomething 保证它不会修改作为指针传递的表的内容。
现在,这个几乎等效的结构呢? :
int doSomething(const table_t t);
这里的const 是什么?表的内容,还是指向表的指针?
如果它是const 的指针,是否有另一种方式(C90 兼容)来保留定义表格大小并告诉其内容将是 const 的能力?
请注意,有时还需要修改表格的内容,因此const 属性不能嵌入到 typedef 定义中。
[编辑] 感谢您迄今为止收到的出色答案。 总结一下:
- typedef 强制大小 N 的初始假设是完全错误的。它的行为基本上与普通指针相同。
-
const属性的行为也与指针一样(与指向指针类型的 typedef 形成鲜明对比,如下面的 @random 下划线) - 要强制执行大小(这不是最初的问题,但现在最终变得非常重要......),请参阅Jonathan's answer
【问题讨论】:
-
不管你把参数声明为
N条目的数组,它仍然是一个指针,大小N被丢弃。 -
如果我理解您的“强制 N 作为表格大小”的假设,那就错了。 See counter-example。没有这样的强制执行。
-
"..任何声明的变量,例如 table_t t; 现在都将表现为普通数组"...具体来说是整数数组。
标签: c arrays constants typedef