C Primer Plus 第10章 数组和指针 10.9 复合文字
博客专区 > idreamo 的博客 > 博客详情
C Primer Plus 第10章 数组和指针 10.9 复合文字
idreamo 发表于1年前
C Primer Plus 第10章 数组和指针 10.9 复合文字
  • 发表于 1年前
  • 阅读 33
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

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

假设需要向带有一个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 ;
}

 

标签: C\C++ 复合文字
共有 人打赏支持
粉丝 12
博文 139
码字总数 224743
×
idreamo
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: