zoukankan      html  css  js  c++  java
  • 要点1:指针、数组和复合字面量

    一维数组及其指针表示法

    一维数组:

    int ar[] = {1,2,3}    // 直接初始化,编译器自动获取数组大小
    int br[3] = {1,2,3}   // 直接指定大小
    

    数组的名字ar其实是一个指针:

    int *pr = ar;
    printf("%d
    ", pr == ar);  // true
    printf("%d
    ", pr+1 == &ar[1]);  // true
    

    所以可以通过指针的方式访问数组:

    printf("%d
    ", *(ar+1));  //  2
    

    二维数组及其指针表示法

    二维数组:

    int ar[][3] = {{1,2,3},{4,5,6}};    // 直接初始化,编译器自动识别大小
    int br[2][3] = {{1,2,3},{4,5,6}};  // 初始化时,显示指定大小
    

    注意,定义多维数组的时候,只有第一个[]中可以省略长度,其他都要显示的指定,因为通过ar+1的形式获取第二个元素的地址的时候,需要知道每个元素的长度.

    这里的ar和br其实是一个包含2个指针元素的数组,每个指针都指向一个大小为3的int型数组,故可以用如下方式访问:

    int (*pr)[3] = ar;     // 定义一个指针,类型为int [3],这里要区别于int *pr[3]
    printf("%d
    ", *(*(pr+1)+1));   // *(pr+1)可以取出第2个数组的首地址,所以输出 5
    

    复合字面量

    在C99标准以前,对于带数组形参的函数,情况不同,可以传递数组,但是没有等价的数组常量。C99新增了复合字面量(compound literal)。字面量是除符号常量外的常量。例如,5是int类型字面量,81.3是double类型的字面量,'Y'是char类型的字面量,"elephant"是字符串字面量。

    下面创建数组的方式和上面创建一维数组的方式等价:

    int *pr;
    pr = (int [3]){1,2,3};   // C99之前是不允许的
    

    这样在形参带数组的函数中传参更方便:

    void sum(const int [], int n);
    int s = sum((int []){1,2,3}, 3);
    

    二维的复合字面量可以这么用:

    int (*pr)[3];
    pr = (int [][3]){{1,2,3},{4,5,6}};   // 和传统二维数组定义方式等价,更方便
    
  • 相关阅读:
    「日常训练」Single-use Stones (CFR476D2D)
    「日常训练」Greedy Arkady (CFR476D2C)
    「Haskell 学习」二 类型和函数(上)
    「学习记录」《数值分析》第二章计算实习题(Python语言)
    「日常训练」Alena And The Heater (CFR466D2D)
    Dubbo 消费者
    Dubbo 暴露服务
    Rpc
    git fail to push some refs....
    Spring Cloud (6)config 客户端配置 与GitHub通信
  • 原文地址:https://www.cnblogs.com/lxmwb/p/13417477.html
Copyright © 2011-2022 走看看