gpt4 book ai didi

C 中数组的 const 和 typedef

转载 作者:太空狗 更新时间:2023-10-29 16:28:35 27 4
gpt4 key购买 nike

在 C 中,可以typedef 一个数组,使用这个结构:

typedef int table_t[N];

这里,table_t 现在被定义为 N 个 int 的数组。声明的任何变量,如 table_t; 现在将作为一个普通的 int 数组。

这种构造的要点是用作函数中的参数类型,例如:

int doSomething(table_t t);

相对等效的函数原型(prototype)可能是:

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

最佳答案

首先,你错了,函数原型(prototype)

int doSomething(table_t t);
int doSomething(int* t);

完全等价。对于函数参数,第一个数组维度总是被重写为指针。因此无法保证接收到的数组的大小。

const - 对数组的限定总是适用于数组的基类型,所以两个声明

const table_t a;
int const a[N];

是等价的,对于函数参数我们有

int doSomething(const table_t t);
int doSomething(int const* t);

关于C 中数组的 const 和 typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31108968/

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