假设需要向一个带有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语言的复合文字的更多相关文章

  1. c语言:复合文字

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

  2. [日常] Go语言圣经--复合数据类型,数组习题

    go语言圣经-复合数据类型 1.以不同的方式组合基本类型可以构造出来的复合数据类型 2.四种类型——数组.slice.map和结构体 3.数组是由同构的元素组成——每个数组元素都是完全相同的类型——结 ...

  3. C复合文字

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

  4. C99新增内容之复合文字(compound literal)

    前言: 最近在复习C,发现了一些新东西,例如:变长数组,复合文字,指针的兼容性等.今天先简单谈一下复合文字. 正文: 假如需要向带有一个int参量的函数传递一个值,您可以传递一个int变量,也可以传递 ...

  5. 复合文字(Compound Literals)

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

  6. [Objective-C语言教程]复合对象(33)

    在Objective-C中,可以在类集群中创建子类,该类集合定义了一个嵌入在其中的类. 这些类对象是复合对象.你可能想知道什么是类集群,下面首先了解什么是类集群. 1. 类集群 类集群是基础框架广泛使 ...

  7. C语言复合字面量的使用

    C99添加的特性,复合字面量(composite literal).一旦熟悉并使用,便会体会到简洁强大的表达. 所谓字面量就是固定数值的表示.数值和字符串类型都有字面量的表达.如: // 100, 1 ...

  8. 标准C 语言总结

    ***************C语言****************** --day01-- Linux是一个和Windows类似的操作系统 通常通过终端软件使用Linux操作系统 终端软件里只能使用 ...

  9. C语言学习书籍推荐《C Primer Plus(中文版)(第5版)》下载

    普拉塔 (Prata S.) (作者), 云巅工作室 (译者) <C Primer Plus(中文版)(第5版)>共17章,介绍了C语言的基础知识,包括数据类型.格式化输入输出.运算符.表 ...

随机推荐

  1. Flex中如何通过showAllDataTips属性使鼠标移动到图表时显示所有的数据Tips的例子

    原文 http://blog.minidx.com/2008/11/10/1616.html 接下来的例子演示了Flex中如何通过showAllDataTips属性,使鼠标移动到图表时显示所有的数据T ...

  2. rsyslog 日志服务器端配置

    $EscapeControlCharactersOnReceive off #关闭rsyslog默认转译ASCII<32的所有怪异字符,包括换行符等 $template tocFormat,&q ...

  3. linux中fork创建进程讲解(转)

    大家知道Linux中创建子进程的一个很好的方法是函数调用fork,但是很多初学者对fork的理解上可能有点困难.我们举个例子来看看fork的用法吧.         大家用fork的时候记住fork是 ...

  4. poj--1517

    n从0取到9,一个for循环,n++,n=0,n<=9 n=4,求1/4!+1/3!+1/2!+1/1!+1/0! 需要一个for循环,i=n,i>=0,i-- sum+=factoria ...

  5. 【Andord真】SlideMenu+ViewPagerIndictor双滑动边栏+滑动导航条

    采取SlideMenu达到的效果侧边栏: 间 setContentView是设置主背景的布局 setBehindContentView是设置左边菜单的布局 setSecondaryMenu是设置右边的 ...

  6. C结构体中位域

    C结构体中位域的一点小知识,最近在看资料时遇到结构体中的一种特殊操作——位域,在下面的程序中我将根据自己的理解进行简单介绍.程序只是为了了解位域的一些性质,运行时有些编译器可能会报错. 程序代码如下( ...

  7. CAD 致命错误

    在用.net进行CAD二次开发的时候,偶尔会出现致命错误,经总结,发现有两点会引起致命错误,在此记下,一来供自己参考,二来与大家分享 : ) 致命错误一: 描述:声明了DBObject对象,但未将对象 ...

  8. 关于新装ubuntu系统update失败和build-essential失败的解决办法

    我是12月4日在新电脑上的vmware-workstation 10 上安装的ubuntu14.04LTS,但安装后再校园环境下总是build-essential失败,上网一查,说是要先update, ...

  9. Windows下C++多线程同步与互斥简单运用

    1.  互斥量,Mutex #include <Windows.h> #include <iostream> using namespace std; DWORD WINAPI ...

  10. Programming C#.Interfaces

    类实现一个接口时,它必须实现该接口的所有部分(方法和属性等),效果相当于类要表明:“我同意履行这个接口所定义的协定.” 从抽象类继承实现了“is-a(是一种)”关系,实现接口时一种“implement ...