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])
{
...
}