C Primer Plus: 第十章 数组和指针

C Primer Plus: 第十章 数组和指针

10.1 数组

  • 数组是一种派生类型。
  • C99之前是不允许变长数组的,如:float a[n];

10.3 指针和数组

  • 在C中,指针加1指的是增加一个存储单元。对数组而言,这意味着加1后的地址是下一个元素的地址,而不是下一个字节的地址。

10.4 函数、数组和指针

  • 函数原型,下面四种原型都是等价的:
int sum(int *ar, int n);
int sum(int *, int);
int sum(int ar[], int n);
int sum(int [], int);
  • 区别函数原型和函数定义。

10.5 指针操作

  • 赋值:把地址值赋给指针:&
  • 解引用:*运算符给出指针指向地址上存储的值。
  • 指针与整数相加:整数都会和指针所指向类型的大小(以字节为单位)相乘,然后把结果与初始地址相加。
  • 递增指针:递增指向数组元素的指针可以让该指针移动至数组的下一个元素。
  • 指针减去一个整数:(指针必须是第一个运算对象),相加的逆操作。
  • 递减指针:逆操作递增
  • 指针求差:可以计算两个指针的差值。通常,求差的两个指针分别指向同一个数组的不同元素,通过计算求出两个元素之间的距离。差值单位与数组类型单位相同

10.6 保护数组中的数据

  • const double * pd = rates; //指向const的指针不能用于改变值。
  • double * const pc = rates; //不能指向别处的指针
  • const double * const pc = rates; //不能更改指向地址,也不能修改指向地址上的值

10.7 指向多维数组的指针

  • int (*pz)[2]; //pz指向一个内含两个int类型的数组
  • 区别int *pz[2] //由于[]优先级高。pax是一个内含两个指针元素的数组,每个元素都指向int的指针
  • C于C++在const上的部分区别:
    • C++允许在声明数组大小时候使用const整数,而C却不允许。
    • C++不允许把const指针赋值给非const指针,而C则允许这样做。
  • 函数参数:
    • int sum2(int ar[][4], int rows); //正确声明
    • int sum1(int ar[][], int rows); //错误声明
    • 这是因为ar+1时,必须知道ar所指向的对象大小
    • 一般而言,声明一个指向N维数组的指针时,只能省略最左边方括号中的值:int sum4d(int ar[][12][12][12], int rows)

10.8 变长数组 (VLA)

  • C99新增了变长数组,在创建数组时,可以使用变量指定数组的维度
int regions = 4;
int quarters = 5;
double sales[regioins][quarters];       //变长数组
  • C99/C11标准规定,可以省略原型中的形参名,但是在这种情况下,必须用星号来代替省略的维度:int sum2d(int, int, int ar[][]);
  • 该函数的定义如下:
int sum2d(int rows, int cols, int ar[rows][cols])
{
    ...
}

你可能感兴趣的:(C)