代码之家  ›  专栏  ›  技术社区  ›  Dpp

什么是“int*a=(int[2]){0,2}你到底怎么做的?

c
  •  10
  • Dpp  · 技术社区  · 15 年前

    当我看到这个符号时,我非常惊讶。它做什么?它是什么样的C概念?

    5 回复  |  直到 15 年前
        1
  •  19
  •   Pete Kirkham    15 年前

    这是C99标准第6.5.2.5节中定义的复合文字。

    它不是C++语言的一部分,所以C++编译器不编译它并不奇怪。或Java或Ada编译器)

    复合文字的值是由初始化的未命名对象的值

    在类型周围放上括号,然后后跟一个初始值设定项列表-它不是强制转换,因为在C99语法中,一个空的初始值设定项列表没有任何意义;相反,它是应用于产生给定类型的对象的类型的后缀运算符。你不是在创造 { 0, 3 } 把它放到一个数组中,就是初始化一个 int[2] 值为0和3。


    至于为什么要使用它,我看不出有什么好的理由在你的单行中,尽管可能是a可以被重新分配指向其他数组,所以这是一个较短的方法来完成前两行:

    int default_a[] = { 0, 2 };
    int *a = default_a;
    
    if (some_test) a = get_another_array();
    

    // fills an array of unions with a value
    kin_array_fill ( array, ( kin_variant_t ) { .ref = value } )
    
        2
  •  6
  •   Community CDub    5 年前

    这是一个c99结构,叫做 复合文字

    根据2005年5月委员会第6.5.2.5节草案:

    一种后缀表达式,由 带圆括号的类型名后跟 用大括号括起来的初始值设定项列表 是复合文字。它提供了一个 其值由给定的未命名对象 初始值设定项列表。

    示例1文件范围定义

    int *p = (int []){2, 4}; 
    

    指向 第二个值是2,第二个值是4。 这个复合词中的表达式 持续时间。

        3
  •  1
  •   yfeldblum    15 年前
    1. 在堆栈上为两个数组分配空间 int
    2. 填充两个数组 内景 与价值观一致 0 2 分别是。
    3. int* 并将这两个变量的[数组]的地址赋给该变量
        4
  •  0
  •   agsamek    15 年前

    (int[2])告诉编译器下面的表达式应该转换为int[2]。这是必需的,因为{0,2}可以转换为不同的类型,如long[2]。强制转换发生在编译时,而不是运行时。

    整个表达式在内存中创建一个数组,并将a设置为指向该数组。

        5
  •  -2
  •   Sjoerd    15 年前
    • {0, 2} 是由0和2组成的数组的表示法。
    • (int[2]) 将其投射到数组(不知道为什么) .
    • int * a = 将其赋给int指针a。