文档章节

C Primer Plus 第10章 数组和指针 10.9 复合文字

idreamo
 idreamo
发布于 2016/08/09 06:55
字数 989
阅读 36
收藏 0
点赞 0
评论 0

假设需要向带有一个int参量的函数传递一个值,您可以传递一个Int变量,也可以传递一个int常量,比如5。在C99标准出现之前,数组参数的情况是不同的:可以传递数组,但没有所谓的数组常量可供传递。

C99新增了复合文字(compound literal)。文字是非符号常量。例如:5是int类型的文字,81.3是double类型的文字,‘Y’是char类型的文字,“elephant”是字符串文字。开发c99标准的委员会认为,如果有能够表示数组和结构 的复合文字,那么在编写程序时将更为方便。

于数对组来说,复合文字看起来像是在数组的初始化列表前面加上用圆括号括起来的类型名。例如,下面是普通数组的声明方法:

int diva[2] = {10,20} ;

下面是一个复合文字,创建了一个包含两个int值的无名称数组:

(int [2]) {10,20}   //一个复合文字

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

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

(int [ ]) {50,20,90} //有三个元素的复合文字

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

int * pt1;

pt1 = (int [2]) {10,20} ;

请注意这个文字常量被标识为一个int 数组。与数组名相同,这个常量同时代表首元素的地址,因此可以用它给一个指向int的指针赋值。随后就可以使用这个指针。例如,本例中*pt1是10,pt1[1]是20。

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

int sum (int ar [ ] ,int n ) ;

...

int total3 ;

total3 = sum( (int [ ] ){4,4,4,5,5,5},6) ;

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

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

int (*pt2) [4] ;  //声明一个指向包含4个int的数组的指针

pt2 = (int [2][4]) { {1,2,3,-9},{4,5,6,-8} } ;

其中复合文字的类型是int [2][4],即一个2x4的int数组。

程序清单  10.19  把上面的这些例子包含到一个完整的程序内。

//flc.c  --有趣的常量
#include <stdio.h>
#define COLS 4
int sum2d(int ar[][COLS],int rows);
int sum(int ar[],int n );
int main (void)
{
    int total1,total2,total3;
    int *pt1;
    int (*pt2) [COLS];

    pt1 = (int [2]){10,20};
    pt2 = (int [2][COLS]){ {1,2,3,-9},{4,5,6,-8} };

    total1 = sum(pt1,2);
    total2 = sum2d(pt2,2);
    total3 = sum((int []){4,4,4,5,5,5},6);

    printf("total1 = %d\n",total1);
    printf("total2 = %d\n",total2);
    printf("total3 = %d\n",total3);

    return 0;
}

int sum (int ar[],int n)
{
    int i;
    int total = 0;

    for (i=0;i<n;i++)
        total+=ar[i];

    return total;
}
int sum2d (int ar[][COLS],int rows)
{
    int r,c;
    int tot=0;

    for(r=0;r<rows;r++)
        for(c=0;c<COLS;c++)
        tot+=ar[r][c];
    return tot ;
}

 

© 著作权归作者所有

共有 人打赏支持
idreamo
粉丝 12
博文 139
码字总数 224743
作品 0
青岛
产品经理
C Primer Plus 第10章 数组和指针 10.3 指针和数组

我们举一个这种变相使用的例子:数组名同时也是该数组首元素的地址。也就是说,如果flizny是一个数组,下面的式子是正确的: flizny == &flizny[0] //数组名是该数组首元素的地址 flizny和&...

idreamo ⋅ 2016/07/25 ⋅ 0

C++ Primer 学习笔记(第三章:字符串、向量和数组)

C++ Primer 学习笔记(第三章:字符串、向量和数组) [TOC] 3.1 命名空间的声明 声明语句可以一行放多条。 位于头文件的代码,一般来说不应该使用声明。因为其内容会拷贝到每个使用该头文件的...

ShawnLue ⋅ 2015/08/20 ⋅ 0

书单及进度(每日更新2015-7-13)

jQuery Mobile Web Development Essentials.pdf 写的很好5 Apache Cordova 3 Programming.pdf 写的比较啰嗦,不过找不到其它的书了3 Web Development with Node and Express.pdf ING(这个已经......

cyper ⋅ 2014/05/14 ⋅ 7

C++ primer第二次阅读学习笔记(第4章)

C++语言应尽量使用vector和迭代器类型,应避免使用低级的数组和指针,涉及良好的程序只有在强调速度时才在类实现的内部使用数组和指针。因此要向成为一个真正的C++程序员就要多使用vector和s...

长平狐 ⋅ 2012/10/08 ⋅ 0

【C++】第4章 复合类型 知识总结

《C++ Primer Plus》第4章知识点总结 内置的C++类型分两组:基本类型和复合类型。本文将介绍复合类型 数组 声明数组的通用格式:typeName arrayName[arraySize]; 数组的初始化 (1)只有在定...

qq_37792173 ⋅ 2017/09/20 ⋅ 0

C Primer Plus 第10章 数组和指针 10.4 函数、数组和指针

假设您要编写一个对数组进行操作的函数,目的是要此函数返回数组内所有元素的和。假设marbles为这个int数组的名称。应该如何来调用这个函数? 一种合乎情理的猜测如下: totao = sum(marble...

idreamo ⋅ 2016/07/28 ⋅ 0

C Primer Plus 第10章 数组和指针 编程练习答案

1、修改程序清单10.7中的程序rain,使它不使用数组下标,而是使用指针进行计算(程序中仍然需要声明并初始化数组)。 2、编写一个程序,初始化一个double数组,然后把数组内容复制到另外两个...

idreamo ⋅ 2016/08/14 ⋅ 0

C Primer Plus 第10章 数组和指针 10.7 指针和多维数组

指针和多维数组有什么关系?为什么我们需要知道它们之间的关系?函数是通过指针来处理多维数组的,因此在使用这样的函数之前,您需要更多的了解指针。假设有如下的声明: int zippo[4][2] ; ...

idreamo ⋅ 2016/08/06 ⋅ 0

C Primer Plus 第11章 字符串和字符串函数 11.1字符串表示和字符串I/O

当然,最基本的您已经知道了:字符串(character string)是以空字符(o)结尾的char数组。因此,您所学的数组和指针就可以用在字符串上。但是由于字符串的使用非常广泛,C提供了很多专为字符...

idreamo ⋅ 2016/08/17 ⋅ 0

《C Primer Plus》读书笔记——存储类、链接和内存管理

背景 距离上次写读书笔记的日子已有半个月了。这段时间一直在做摄像头直立平衡车,也把《C Primer Plus》的中级部分扫了一遍。现在做赛道算法识别遇到瓶颈了,就想把读书笔记补回来。原计划是...

cugwyman ⋅ 2017/02/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 1

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

Nginx + uwsgi @ubuntu

uwsgi 安装 sudo apt-get install python3-pip # 注意 ubuntu python3默认没有安装pippython3 -m pip install uwsgi 代码(test.py) def application(env, start_response): start_res......

袁祾 ⋅ 昨天 ⋅ 0

版本控制工具

CSV , SVN , GIT ,VSS

颖伙虫 ⋅ 昨天 ⋅ 0

【2018.06.19学习笔记】【linux高级知识 13.1-13.3】

13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令

lgsxp ⋅ 昨天 ⋅ 0

LVM

LVM: 硬盘划分分区成物理卷->物理卷组成卷组->卷组划分逻辑分区。 1.磁盘分区: fdisk /dev/sdb 划分几个主分区 输入t更改每个分区类型为8e(LVM) 使用partprobe生成分区的文件:如/dev/sd...

ZHENG-JY ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部