备案网站注意事项,wordpress转换小程序,网站建设的技术问题,国外免费logo网站C语言中有没有见过(int [2]){19,20}或者int (*pt2)[4]的使用方法#xff0c;字面上可能不好理解#xff0c;这是C99之后才新增的知识点#xff0c;名为复合型表述Compound Literals#xff0c;一旦熟悉使用#xff0c;便会体会到它简洁而强大的表达。什么是”复合型表述“…C语言中有没有见过(int [2]){19,20}或者int (*pt2)[4]的使用方法字面上可能不好理解这是C99之后才新增的知识点名为复合型表述Compound Literals一旦熟悉使用便会体会到它简洁而强大的表达。什么是”复合型表述“假设给带int类型的形参函数传递一个值可以传递int类型的变量也可以传递int类型常量但是对于带数组形参的函数则不一样可以传递数组但是不支持传递数组常量由此C99新增了“复合形表述”的用法“表述(Literals)”是指除符号常量外的常量。例如10是一种int的类型的表述10.24是一种double类型的表述“lixiaoyao”是一种字符串类型的表述等——这些都是关于单个类型常量值的表述。自然而然的对于数组或者结构体这种内部存在多个成员的数据类型其关于常量的表述就叫做复合型表述。关于数组的复合型表述数组的复合型表述和数组初始化列表差不多前面使用括号括起来的类型名例如下面是一个普通的数组声明。int age[2][19,20];下面创建了一个和age数组相同的匿名数组也有两个int类型值。(int [2]){19,20}; //复合型表述注意去掉申明中的数组名留下的int[2]就是复合型表述的类型名。初始化有数组名的数组可以省略数组的大小复合型表述也可以省略大小编译器会自动计算数组当前的元素个数int []{19,20,21,22,23}//内含5个元素的复合型表述因为复合型表述是匿名的所以不能先创建然后再使用它必须在创建的同时使用它如下int x;
// 正确
x 100;int arr[1];
// 错误
arr {0};一般需要这样定义使用int *pt1;
pt1(int[2]){19,20};注意该复合型表述的字面常量与上面创建age数组的表述量完全相同复合型表述的类型名也代表着首元素的地址所以可以把它赋给指向int的指针。作为实际参数复合型表述作为实际参数传递给带有匹配形式参数的函数。#include stdio.h
int sum(const int age[],int n);int main () {int total;total sum((int[]){4,4,4,5,5,5},6);return 0;
}int sum(const int age[],int n){int i0;for(i0;in;i){printf(age is %d\n,age[i]);}
}输出结果如下应用于二维数组或者多维数组这种用法还可以应用于二维或者多维数组例如下面演示了如何创建二维int数组并存储其地址。int (*pt2)[4];
//申明一个指向二维数组的指针该数组内有2个数组元素
//每个元素是内含4个int类型值的数组
pt2 (int [2][4]) {{1,2,3,4,},{5,6,7,8,}};对于结构体假设如下所示声明了struct foo和structurestruct foo {int a; char b[2];
} structure;这是使用复合型表述构造struct foo的示例structure ((struct foo) {x y, a, 0});这等效于以下代码{struct foo temp {x y, a, 0};structure temp;
}也可以构造一个数组如下所述如果复合型表述的所有元素都是由简单的常量表达式组成则可以将复合型表述强制转换为指向其第一个元素的指针并在此类初始化程序中使用 如下所示char **foo (char *[]) { x, y, z };标量类型和联合类型的复合型表述也被允许在下面的示例中变量i初始化为值2该值是由复合型表述创建的未命名对象递增的结果。int i int{1};作为GNU扩展GCC允许通过复合型表述初始化具有静态存储持续时间的对象如果复合型表述和对象的类型匹配则如同仅使用括号括起来的列表初始化对象一样处理该对象复合型表述的元素必须是常量。如果要初始化的对象具有未知大小的数组类型则该大小由复合型表述的大小确定。static struct foo x (struct foo) {1, a, b};
static int y[] (int []) {1, 2, 3};
static int z[] (int [3]) {1};等效于以下内容static struct foo x {1, a, b};
static int y[] {1, 2, 3};
static int z[] {1, 0, 0};C/C中的区别复合型表述看起来像是用括号括起来的聚合初始化程序列表的强制转换它的值是强制类型转换中指定类型的对象其中包含初始化程序中指定的元素。与强制转换的结果不同复合型表述是左值但是 C 中目前还没有这种无名左值作为扩展GCC在C90模式和C中也支持复合型表述但C语义有所不同。在C中复合型表述表示具有静态或自动存储持续时间的未命名对象在C中复合型表述表示一个临时对象该对象仅在其完整表达式结束之前一直存在。所以定义良好的C代码采用复合型表述的子对象的地址可以在C中未定义因此g编译器不能将临时数组转换为指针。例如如果上面的数组复合型表述示例出现在函数内部则C中对foo的任何后续使用都将具有未定义的行为因为数组的生存期在声明foo之后结束。作为一种优化g编译器有时会给数组复合型表述提供更长的生存期当数组出现在函数外部或具有const限定类型时。如果foo及其初始化程序的元素类型为char * const而不是char *或者foo为全局变量则该数组将具有静态存储持续时间。参考https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.htmlEND作者李肖遥来源技术让梦想更伟大版权归原作者所有如有侵权请联系删除。