前言:

最近在复习C,发现了一些新东西,例如:变长数组,复合文字,指针的兼容性等。今天先简单谈一下复合文字。

正文:

假如需要向带有一个int参量的函数传递一个值,您可以传递一个int变量,也可以传递一个int常量,比如5。在C99标准以前:可以给函数传递数组,或者其他自定义的结构等,但是没有所谓的数组(结构)常量可以来传递。C99新增了复合文字(compound literal)。文字是非符号常量。例如:5是int类型的文字;82.3是float类型的文字等等。C99标准委员会认为:如果又能够表示数组和结构内容的复合文字,那么在编写程序的时候要方便的多。

1.对于数组来说,复合文字看起来像是在数组的初始化列表前面加上用圆括号括起来的类型名。

int diva[]={,};//普通数组
(int []){,};//一个复合文字

注意:类型名就是前面声明中去掉diva后剩余的部分,即int[2]。

2. 正如初始化一个命名数组时可以省略数组大小一样,初始化一个复合文字时可以省略数组大小,编译器会自动计算元素的数目:

(int []){,,};//有3个元素的复合文字

3. 由于这些复合文字没有名称,因此不可能在一个语句中创建它们,然后在另一个语句中使用。而是必须在创建它们的同时通过某种方法来使用它们,一种方法是使用指针保存其位置。请看下面的例子:

int* pt1;
pt1=(int []){,};

众所周知,数组名其实就是指向数组首元素的指针,所以此处的pt1就相当于数组名,所以之后可以像使用数组名一样,使用这个指针了。

4. 另外,复合文字也可以做为实际参数被传递给带有类型与之匹配的形式参量的函数:

int sum(int ar[],int n)
{
int total=;
for(int i=;i<n;i++)
total+=ar[i];
return total;
}
int tot;
tot=sum((int[]{,,,,,}),6);

此处第一个参数是包含6个元素的int型数组,同时也是首元素的地址(同数组名一样)。这种给函数传递信息而不必先创建数组的做法,是复合常量的通常使用方法

5. 可以把这种技巧用在处理二维数组或多维数组的函数中。例如,下面的代码介绍如何创建一个二维int数组并保存其地址:

int (*pt2)[];//声明一个数组指针
pt2=(int [][]){{,,,-},{,,,-}};

6. 在结构中也可以使用复合文字。

int add(struct xy instance)
{
return instance.x+instance.y;
}
int sum = add((struct xy){,}); //调用

7.对复合文字进行取址操作。

struct point{
double x;
double y;
};
struct point* instance=&((struct point){2.2,2.3});

8.总结:

(1)当一个类似结构的东西需要临时构造的时候,可以用 (type_name){xx,xx,xx},而type_name就是之前定义的格式,去掉变量名(数组名)即可, 这种使用方法有点像 C++ 的构造函数

(2)其实,复合文字就相当于一个常量,只不过形式较为复杂而已,所有可以用常量的地方均可以用复合文字,例如,宏定义。

(3)使用复合文字,在想传一个“常量”时,就不必先定义,再传值了,比如传一个常数坐标(struct point{double x;double y;}),这样就不用先定义一个结构变量,再传结构体过去了,代码更加简洁。

(4)值得注意的是,复合文字具有左值语义。

C99新增内容之复合文字(compound literal)的更多相关文章

  1. C99新增内容之变长数组(VLA)

    我们在使用多维数组是有一点,任何情况下只能省略第一维的长度.比如在函数中要传一个数组时,数组的行可以在函数调用时传递,当属数组的列却只能在能被预置在函数内部.看下面一个例子: #define COLS ...

  2. C语言的复合文字

    假设需要向一个带有int型参量的函数传递一个值,这时可以传递一个int型常量,也可以传递一个int型的变量.在C99标准之前,数组参数情况于现在不一样,没有所谓的数组常量可供传递,而在C99中增加了复 ...

  3. 复合文字(Compound Literals)

    复合文字(Compound Literals) 阅读代码时发现了这行 1 setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&(int){1},sizeof(in ...

  4. C复合文字

    C99之前,可以传递数组,但是没有所谓的数组常量可供传递,于是新增了复合文字. 普通数组声明方法: int d[2]={10,20}; 复合文字声明: 与数组名相同,常量同时代表元素的地址. (int ...

  5. c语言:复合文字

    复合文字的意义,相当于是在C语言中,为数组类型定义了一种类似于8之于int,'w'之于char一样的常量类型,所以从C99之后,可以在一些地方使用复合文字来代替数组使用. 复合文字的声明 (]){,, ...

  6. C99C新增内容

    继上一篇复合文字之后,今天我们继续谈一谈C99C的新特性. C99标准是继C89标准之后的第二个C语言官方标准,于1999年12月1日正式发布,其中对数据类型(增加了对_Bool),关键字(增加了in ...

  7. C lang: Compound literal

    Xx_Introduction C99 stantard. Upate array and struct a compound literal. Literal is date type value. ...

  8. AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码

    AppleWatch开发教程之Watch应用对象新增内容介绍以及编写运行代码 添加Watch应用对象时新增内容介绍 Watch应用对象添加到创建的项目中后,会包含两个部分:Watch App 和 Wa ...

  9. javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

随机推荐

  1. [CodeForces] CF226D The table

    Harry Potter has a difficult homework. Given a rectangular table, consisting of n × m cells. Each ce ...

  2. 第十六节:pandas之日期时间

    Pandas日期功能扩展了时间序列,在财务数据分析中起主要作用.

  3. 内存_RAM或ROM_和FLASH存储的真正区别总结

    http://blog.sina.com.cn/s/blog_4b37304d0100fg10.html

  4. 【[Offer收割]编程练习赛12 C】矩形分割

    [题目链接]:http://hihocoder.com/problemset/problem/1495 [题意] [题解] 把每个方块都再分成3*3的小块; 这样; 对于一个方块来说 如果是'\' 则 ...

  5. AIM Tech Round (Div. 2)——ABCD

    http://codeforces.com/contest/624 A.python是用来写div2的AB题的... a, b, x, y = map(float, raw_input().split ...

  6. 美团 CodeM 复赛」城市网络

    美团 CodeM 复赛」城市网络 内存限制:64 MiB时间限制:500 ms标准输入输出 题目描述 有一个树状的城市网络(即 nnn 个城市由 n−1n-1n−1 条道路连接的连通图),首都为 11 ...

  7. 常用Git命令大全思维导图

    开发中代码管理少不了使用Git,对于初学者来说Git命令的学习是一个难过的坎,为了帮助大家记忆并快速掌握Git的基本使用,我把常用的Git命令整理成思维导图,分享给大家. 高清大图在线预览 http: ...

  8. CentOS6.5下卸载MySql(yum安装)

    因为我是用yum安装的mysql,所以卸载相对简单 yum -y remove mysql* 再把相关的文件删掉, rm -f /etc/my.cnf.rpmsave  rm -rf /var/lib ...

  9. hdu_1039_Easier Done Than Said_201311051511

    Easier Done Than Said? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  10. [bzoj1878][SDOI2009]HH的项链_树状数组

    HH的项链 bzoj-1878 SDOI-2009 题目大意:给定一个n个数的序列,m次查询.查询区间数的种类个数. 注释:$1\le n \le 5\cdot 10^4$,$1\le m\le 2\ ...