C语言的复合文字
假设需要向一个带有int型参量的函数传递一个值,这时可以传递一个int型常量,也可以传递一个int型的变量。在C99标准之前,数组参数情况于现在不一样,没有所谓的数组常量可供传递,而在C99中增加了复合文字。文字是非符号的常量,如5是int型的文字25.3是double型的文字。由此可见如果有能够表示数组和结构内容的文字,那么编程将会更加方便。
对于数组来说,复合文字看起来就像是在数组初始化列表加上圆括号括起来的类型名,例如:下面是普通数组的声明方法:
int a[2]={10,20};
下面是一个复合文字,它创建了一个包含两个int型的无名称数组:
(int [2]){10,20};
注意、类型名就是前面声明中去掉a的剩余部分,即int [2]
正如初始化一个数组时可以不指定数组的大小一样,初始化一个复合文字也可以省略大小:
(int []){10,20,30}; //有三个元素的复合文字
由于这些符合文字没有名字,不能在一个语句中创建他们,需要在其他语句中使用。使用的一种方法是使用指针:
int *p;
p=(int []){10,20,30};
注意这个文字常量被表示为一个int型数组。与数组名相同,这个常量表示这个数组的首地址,如在本例中:
*p==10
另外复合文字可以作为参数传递给一个函数:
int sum(int ar[],int n)
...............
int tot;
tot=sum((int []){1,,2,3,4},4);
这种给函数传递数组信息而不用先创建数组的方式,符合常量通常的使用方法。
这种方法也可以使用在多维数组的使用上面,如创建一个二维数组并保存其地址:
int (*p)[4];
p=(int [2][4]){{1,2,3,4},{5,6,7,8}};
其中复合文字类型是int [2][4],即一个2*4的int数组。
综合使用代码:
#include <stdio.h>
#define COLS 4 void sum2d (int a[][COLS],int row);
void sum (int a[],int n); int main (void)
{
int *p1;
int (*p2)[COLS]; p1=(int [2]){10,20};
p2=(int [2][COLS]){{1,2,3,4},{5,6,7,8}};
sum (p1,2);
sum2d (p2,2);
}
void sum (int a[],int n)
{
int tot=0; for (int i=0;i<n;i++)
{
tot+=a[i];
}
printf ("The sum of all is %d\n",tot);
}
void sum2d (int a[][COLS],int row)
{
int tot=0; for (int i=0;i<row;i++)
{
for (int j=0;j<COLS;j++)
{
tot+=a[i][j];
}
}
printf ("The sum of all is %d\n",tot);
}
C语言的复合文字的更多相关文章
- c语言:复合文字
复合文字的意义,相当于是在C语言中,为数组类型定义了一种类似于8之于int,'w'之于char一样的常量类型,所以从C99之后,可以在一些地方使用复合文字来代替数组使用. 复合文字的声明 (]){,, ...
- [日常] Go语言圣经--复合数据类型,数组习题
go语言圣经-复合数据类型 1.以不同的方式组合基本类型可以构造出来的复合数据类型 2.四种类型——数组.slice.map和结构体 3.数组是由同构的元素组成——每个数组元素都是完全相同的类型——结 ...
- C复合文字
C99之前,可以传递数组,但是没有所谓的数组常量可供传递,于是新增了复合文字. 普通数组声明方法: int d[2]={10,20}; 复合文字声明: 与数组名相同,常量同时代表元素的地址. (int ...
- C99新增内容之复合文字(compound literal)
前言: 最近在复习C,发现了一些新东西,例如:变长数组,复合文字,指针的兼容性等.今天先简单谈一下复合文字. 正文: 假如需要向带有一个int参量的函数传递一个值,您可以传递一个int变量,也可以传递 ...
- 复合文字(Compound Literals)
复合文字(Compound Literals) 阅读代码时发现了这行 1 setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&(int){1},sizeof(in ...
- [Objective-C语言教程]复合对象(33)
在Objective-C中,可以在类集群中创建子类,该类集合定义了一个嵌入在其中的类. 这些类对象是复合对象.你可能想知道什么是类集群,下面首先了解什么是类集群. 1. 类集群 类集群是基础框架广泛使 ...
- C语言复合字面量的使用
C99添加的特性,复合字面量(composite literal).一旦熟悉并使用,便会体会到简洁强大的表达. 所谓字面量就是固定数值的表示.数值和字符串类型都有字面量的表达.如: // 100, 1 ...
- 标准C 语言总结
***************C语言****************** --day01-- Linux是一个和Windows类似的操作系统 通常通过终端软件使用Linux操作系统 终端软件里只能使用 ...
- C语言学习书籍推荐《C Primer Plus(中文版)(第5版)》下载
普拉塔 (Prata S.) (作者), 云巅工作室 (译者) <C Primer Plus(中文版)(第5版)>共17章,介绍了C语言的基础知识,包括数据类型.格式化输入输出.运算符.表 ...
随机推荐
- Android开发:自定义GridView/ListView数据源
http://mobile.51cto.com/android-259861.htm 在开发中,我们常常会遇到比较复杂的GridView/ListView的布局,重新实现BaseAdapter不但能帮 ...
- Web模板
http://www.iteye.com/news/26229 http://designmodo.com/admin-html-website-templates/#ixzz1mj36E4kN ht ...
- git创建与合并分支
创建与合并分支 在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分 支,即master分支.HEAD严格来 ...
- 列"xx"不在表Table中
在数据库中用了left join来查一个表的所有列和另一个表的一个列,但无论用IDataReader还是DataSet都不能获取到另一个表的列,调试时总是说没有那个值,但在数据库中执行语句又有.一直想 ...
- 切换tab,并且动态添加标签
<script type="text/javascript"> /*处理ie7.ie8不兼容getElementsByClassName*/ if(!document. ...
- 整理的一些数据库不容易想到的SQL语句实例一
1.行转列SQL语句 SELECT * FROM ( SELECT [FID] , [Weeks] , [Qty] FROM dbo.TempTable where Weeks is not null ...
- OC语法6——内存管理之引用计数器(retain,release)
OC内存管理: 一.引用计数器: Java有垃圾回收机制(Garbage Collection,GC).也就是说当我们创建对象后,不需要考虑回收内存的事,Java的垃圾回收机制会自动销毁该对象,回收它 ...
- AutoCompleteTextview、MultiAutoCompleteTextView
AutoCompleteTextview 动态匹配输入内容文本框 属性: android:completionThreshold="2"; ...
- Linux网络管理——Linux网络命令
3. Linux网络命令 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB&quo ...
- css3——webkit-animation动画
-webkit-animation:仍旧是一个复合属性, -webkit-animation: name duration timing-function delay iteration_coun ...