再学C语言42:复合文字

文章讨论了C99标准中引入的复合文字概念,它允许在不命名的情况下创建和传递数组。复合文字可以用于初始化和作为参数传递给函数,例如在`sum`函数的例子中。此外,还强调了数组在函数调用中实际传递的是地址,而不是整个数组,以及处理数组时需要提供元素个数的重要性。数组和指针之间的关系也在讨论之中,包括它们在操作上的相似性和变长数组的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设需要向带有一个int参量的函数传递一个值,可以传递一个int变量,也可以传递一个int常量

C99之前的标准规定:数组参数的传递中,没有所谓的数组常量的概念

C99新增能够表示数组和结构内容的复合文字

数组声明:

int array[3] = {1, 2, 3}; // 普通数组的声明方法
(int [3]) {1, 2, 3}; // 复合文字,创建一个包含3个int值的无名称数组

// 初始化一个复合文字时可以省略数组大小,编译器会自动计算元素的数目
(int []) {1, 2, 3}; // 包含3个元素的符合文字

复合文字没有名称,不可能在一个语句中创建,而在另一个语句中使用;复合语句必须在创建的同时通过某种方法使用:例如使用指针保存其位置

int * p;
p = (int [3]) {1, 2, 3}; // 与数组名相同,文字常量同时代表其首元素的地址

复合文字也可以作为实际参数被传递给带有类型与之匹配的形参的函数

int sum(int arr[], int n);
...
int res;
...
res = sum((int []) {1, 2, 3, 4}, 4); // 这种给函数传递信息而不用先创建数组的方法
                                     // 是复合常量的通常使用方法

 

示例代码:

#include <stdio.h>

#define COLS 4

int sum_2d(int arr[][COLS], int rows);
int sum_1d(int arr[], int n);

int main(void)
{
    int res1, res2, res3;
    int *p1;
    int (*p2) [COLS];

    p1 = (int [3]) {1, 2, 3};
    p2 = (int [2][COLS]) {
        {1, 2, 3, 4},
        {5, 6, 7, 8}
    };

    res1 = sum_1d(p1, 3);
    res2 = sum_2d(p2, 2);
    res3 = sum_1d((int []) {6, 7, 8, 9}, 4);

    printf("result 1 is %d\n", res1);
    printf("result 2 is %d\n", res2);
    printf("result 3 is %d\n", res3);
}

int sum_1d(int arr[], int n)
{
    int i;
    int temp = 0;

    for(i = 0; i < n; i++)
    {
        temp += arr[i];
    }

    return temp;
}

int sum_2d(int arr[][COLS], int rows)
{
    int i, j;
    int temp = 0;

    for(i = 0; i < rows; i++)
    {
        for(j = 0; j < COLS; j++)
        {
            temp += arr[i][j];
        }
    }

    return temp;
}

运行结果:

3678878daf3342e3b78c2e95096b73d9.png


数组和指针的总结

1)当需要存储同种类型的多个元素时,数组是最佳选择

2)C把数组归于派生类型,因为其建立在其他类型智商

3)使用数组名作为实参时,并不是把整个数组传递给函数,而是传递数组的地址,因此相应的形参是一个指针

4)处理数组时,函数必须知道数组的地址和元素的个数;数组地址直接传递给函数;数组元素的个数信息需要内建与函数内部或作为独立参数传递给函数;数组元素的个数信息作为独立参数传递时,函数可以处理不同大小的数组,通用性和适应性无疑更好

5)数组和指针紧密联系,指针符号和数组符号的运算往往可以互换使用;允许处理数组的函数使用指针作为形参

6)必须用一个常量表达式为传统的C数组指定其大小,因此在编译时数组大小已经确定;C99标准提供变长数组,数组的大小可以是变量,允许变长数组的大小在程序运行时才确定

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forster-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值