当我看到这个符号时,我感到非常惊讶。它有什么作用,它是一种什么样的 C 概念?
最佳答案
这是 C99 标准第 6.5.2.5 节中定义的复合文字。
它不是 C++ 语言的一部分,因此 C++ 编译器不编译它也就不足为奇了。 (或 Java 或 Ada 编译器)
复合文字的值是由 初始化列表。如果复合文字出现在函数体之外,则对象 具有静态存储期限;否则,它具有与关联的自动存储持续时间 封闭 block 。
所以不,它不会破坏堆栈。编译器为对象分配存储空间。
括号放在类型周围,然后是一个初始化列表——它不是强制转换,因为一个简单的初始化列表在 C99 语法中没有意义;相反,它是应用于产生给定类型对象的类型的后缀运算符。您不是在创建 { 0, 3 }
并将其转换为数组,而是在用值 0 和 3 初始化 int[2]
。
至于为什么使用它,我在你的单行中看不到一个很好的理由,尽管它可能是 a 可以被重新分配以指向其他数组,所以这是第一个的较短方法两行:
int default_a[] = { 0, 2 };
int *a = default_a;
if (some_test) a = get_another_array();
我发现它对于将临时 union 传递给函数很有用
// fills an array of unions with a value
kin_array_fill ( array, ( kin_variant_t ) { .ref = value } )
关于c - "int *a = (int[2]){0, 2};"究竟是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3023738/