常量元素与常量数组

4

每个人都知道如何声明具有常量元素的数组:

const int a[10];

显然,也可以通过typedef声明一个 它本身 就是常量的数组:

typedef int X[10];
const X b;

从技术和实际角度来看,ab是相同类型还是不同类型?

5
无论如何都不能将数组赋值给任何变量。 - EOF
一个数组可以有常量元素,数组的大小是编译时常量...但是什么是常量数组呢?我很好奇。 - SandBag_1996
1
在C语言中,constant和const的含义是不同的。 - 2501
1
一个类似的问题:https://dev59.com/M43da4cB1Zd3GeqPtwLO - Blagovest Buyukliev
@BlagovestBuyukliev 这不是一个类似的问题,我认为这是一个重复的问题。但是回答者似乎暗示数组本身是“const”,这是不正确的。 - uh oh somebody needs a pupper
3个回答

4
他们具有相同的类型, 尽管clang会以不同的方式打印它们。由于数组本身无法是const, 因此被称为"fall through"。
对于未进行typedef的版本,clang将类型打印为const int [10]。对于typedef版本,它打印int const[10]。两者都是等价的。 Coliru in action

4
显然,也可以声明一个本身是常量的数组。在N1256中的§6.7.3/8中指出:如果数组类型的规范包含任何类型限定符,则元素类型是被限定的,而不是数组类型。然后脚注118说:这两种情况都可以通过使用typedef发生。

1
运行了一些测试:

typedef int X[10];

#define typeinfo(t) _Generic((t), \
  X: "int X[10]", \
  int: "int", \
  int *: "int *", \
  const int *: "const int *", \
  default: "not" \
  )

int main(void) {
  const int a[10];
  const X b;

  printf("%zu\n", sizeof (const int *));
  puts(typeinfo(a));
  puts(typeinfo(b));
  printf("%zu\n", sizeof a);
  printf("%zu\n", sizeof b);
  puts(typeinfo(a[0]));
  puts(typeinfo(b[0]));
  printf("%zu\n", sizeof a[0]);
  printf("%zu\n", sizeof b[0]);
}

输出

4
const int *
const int *
40
40
int
int
4
4

这两个变量大小相同,当作为参数传递时会转换为相同的类型。它们都不是指针,而是数组。

通过代码分析和测试,它们被认为是相同类型。


它们从定义上也是相同类型的! - Ian Abbott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接