zoukankan      html  css  js  c++  java
  • 《C Prime Plus》第十节笔记

    数组和指针


    10.1 数组


    10.1.1 初始化数组
    • 标量变量:只储存单个值的变量

    • 创建只读数组,应该用const声明和初始化数组

      const int days[] = {1,2,3,5};
      
    • 省略方括号中的数字,编译器会自动匹配数组大小和初始化列表中的项数


    10.1.2 指定初始化容器 c99

    例:

     int arr[6] = {[5]=212};
    
    • 重要特性一:如果指定初始化容器后面又更多的值,如[5]=4,22,566;那么后面这些值将被用于初始化指定元素的后面的元素
    • 重要特性二:初始化可以覆盖之前的初始化

    10.1.3 给数组元素赋值

    10.1.4 数组边界
    • 使用越界的数组会造成意外错误,例如改变其他数组元素的值,或是导致程序异常终止

    10.1.5 指定数组的大小
     int n=5;
     int arr[n];
    
    • 以上的初始化方式在c99之前不允许,而c99允许这样做。这创建了一种新的数组:VLA
    • VLA成为变长数组(variable-length array)

    10.2 多维数组


    10.3 指针和数组

    • 数组名是数组首元素的地址

      arr == &arr[0];
      
    • 指针的加减是它所指向类型的大小加减


    10.4 函数、数组和指针

    • int ar[]和int *ar形式都表示ar是一个指向int的指针,但是,int ar[]只能用于声明形式参数,第二种可以改变数组内容。
    10.4.1 使用指针形参
    • 用函数处理数组
      1. 一个指针形参标识数组开始,另一个整数形参表示待处理数组元素个数。
      2. 一个指针指向数组的开始处,另一个指向数组的结束处。
    • C 保证在给数组分配空间时,指向数组后面第一个位置的指针仍是有效的指针。
    10.4.2 指针表示法和数组表示法

    10.5 指针基本操作

    • 分别是:
      1. 赋值
      2. 解引用
      3. 取址
      4. 指针和整数相加
      5. 递增指针
      6. 指针减去一个整数
      7. 递减指针
      8. 指针求差
      9. 比较
    • C 只能保证指向数组任意元素的指针和指向数组后面第1个位置的指针有效。
    • 千万不要解引用未初始化的指针,否则可能会擦写数据或代码。
    • 指针的第一个基本用法是在函数间传递信息,第二个基本用法是用在处理数组的函数中。

    10.6 保护数组中的数据

    10.6.1 对形式参数使用const
    • 不能修改数组中的数据内容,保护原始数据
    10.6.2 const的其他内容
    • const指针虽然不能修改其所指向的数据,但可以使其指向其他地址。
    • 把const数据或非const数据的地址初始化为指向const的指针或为其赋值时合法的。
    • 而普通指针只能被赋予非const数据的指针
    • const 类型 * -> 定值,不可被修改
    • 类型 const * -> 定地址,不可被修改
    • const 类型 *const -> 值与地址都不可被修改

    10.7 指针和多维数组

    • 地址的地址或指针的指针就是双重间接的例子

      int arr[4][2];
      
      arr==&arr[0];
      arr[0]==&arr[0][0];
      
    • 最好用简单的数组表示法,而不是指针表示法。

    10.7.1 指向多维数组的指针
    • 声明:

      int (* p)[2];   //p是指向一个内含两个int类型的数组的指针
      //而[]的优先级高于*,我们可以省去括号:
      //[]先和p结合成数组,然后*表示p内含指针
      int * p[2];  //p是一个内含两个指针元素的数组,每个元素都指向int的指针
      
    10.7.2 指针的兼容性
    10.7.3 函数和多维数组
    • 如果arr是二维数组,arr[]就是一维数组,可将其视为二维数组的一行

    • 一般而言,声明一个指向N维数组的指针时,只能省略最左边方括号中的值:

      int sum4d(int arr[][20][30][15] , int rows );
      

    10.8 变长数组(VLA)

    • C99新增了变长数组(variable-length array,VLA),允许使用变量表示数组的维度,如下:

      int quarter = 4;
      int regions = 5;
      double VLA[quarter][regions];  //一个变长数组VLA
      
    • 变长数组不能改变大小,这里的“变”的意思是:在创建数组时,可以使用变量指定数组的维度。

    • 声明一个带二维变长数组参数的函数,要注意顺序:

      int sun2d(int rows, int cols,int ar[rows][cols] );
      
    • 变长数组还允许动态内存分配,可在程序运行时指定数组大小。普通的C数组都是静态内存分配,即在编译时确定数组大小。


    10.9 复合字面量

    • C99新增了复合字面量(compound literal),字面量是除符号常量外的常量。

      int diva[2] = {10,20};  //一个普通的数组声明
      (int [2]) {10,20}   //复合字面量
      (int []) {10,20} //复合字面量也可以省略大小,编译器自动计算
      
    • 因为复合字面量是匿名的,所以不呢个先创建后使用它,必须在创建的同时使用它。使用指针记录就是一种用法:

      int *pl;
      pl = (int []) {10,20}; //这个与diva数组完全相同
      

    10.10 关键概念

    • 数组用于储存相同类型的数据,C把数组看作是派生类型
    • 在把数组名作为实际参数时,传递给函数的不是整个数组,而是数组的地址。
  • 相关阅读:
    一句代码实“.NET技术”现批量数据绑定[上篇] 狼人:
    目录搜索Unity与本地库交互
    微软脱机实验五十微软应用程序虚拟化之五APPV 5.1脱机使用应用程序
    文件编码H264编解码器性能测试
    串字符串KMP hdu3613Best Reward
    等待时间clientNYOJ 179 LK's problem
    tag备份Oracle Rman技术总结(一)——备份
    任务队列ThreadPoolExecutor线程池的使用与理解
    数量queuepoj1149 PIGS
    android手机Android屏幕分辨率、密度的正确获取
  • 原文地址:https://www.cnblogs.com/DorinXL/p/11803694.html
Copyright © 2011-2022 走看看