1、对形式参量使用 const
函数之所以可以改变数组的内容,是因为函数使用了指针,从而能够直接使用原始数据。
使用 const 并不要求原始数据是固定不变的;只是说明函数在处理const所定义数组时,应把数组当做是固定不变的。
如果函数想修改数组,那么在声明参量时就不要使用 const ;如果函数不需要修改数组,那么在声明数组参量时最好使用const 。
2.指针与多维数组
2.1 指针与多维数组
zippo[m][n] == *(*(zippo + m) + n)
#include <stdio.h>
int main(void)
{
int zippo[4][2] = { {2,4}, {6,8}, {1,3}, {5, 7} };
printf(" zippo = %p, zippo + 1 = %p
",
zippo, zippo + 1);
printf("zippo[0] = %p, zippo[0] + 1 = %p
",
zippo[0], zippo[0] + 1);
printf(" *zippo = %p, *zippo + 1 = %p
",
*zippo, *zippo + 1);
printf("zippo[0][0] = %d
", zippo[0][0]);
printf(" *zippo[0] = %d
", *zippo[0]);
printf(" **zippo = %d
", **zippo);
printf(" zippo[2][1] = %d
", zippo[2][1]);
printf("*(*(zippo+2) + 1) = %d
", *(*(zippo+2) + 1));
return 0;
}
运算结果:
zippo=0x7fff5fbff8a0, zippo+1=0x7fff5fbff8a8
zippo[0]=0x7fff5fbff8a0, zippo[0]+1=0x7fff5fbff8a4
*zippo=0x7fff5fbff8a0, *zippo+1=0x7fff5fbff8a4
zippo[0]=0x7fff5fbff8a0, zippo[0]+1=0x7fff5fbff8a4
*zippo=0x7fff5fbff8a0, *zippo+1=0x7fff5fbff8a4
zippo[0][0] = 2
*zippo[0] = 2
**zippo = 2
zippo[2][1] = 3
*(*(zippo+2) + 1) = 3
输出显示出二维数组 zippo 的地址和一维数组 zippo[0] 的地址是相同的,均为相应的数组首元素的地址。然而,差别也是有的。int 是4个字节长, zippo[0] 指向4字节长的数据对象,对 zippo[0] 加 1 导致它的值增加4 。数组名 zippo 是包含两个 int 数的数组的地址,因此它指向 8 字节长的数据对象,对 zippo 加 1 导致它的值增加8 。
分析 *(*(zippo+2) + 1)
zippo | 第1个大小为 2 个 int 的元素的地址 |
zippo+2 | 第3个大小为 2 个 Int 的元素的地址 |
*(zippo+2) | 第3个元素,即包含2个 int 值的数组,因此也是其第1个元素(int 值)的地址 |
*(zippo+2)+1 | 包含2个 int 值的数组的第2个元素(int 值)的地址 |
*(*(zippo+2)+1) | 数组第3行第2个 int 的值(zippo[2][1]) |
2.2 指向多维数组的指针
int (* pz) [2]; //pz 指向一个包含2个int值的数组
该语句表明 pz 是指向包含2个 int 值的数组的指针。使用圆括号的原因是因为表达式中 [] 的优先级高于 * 。
如果我们这样声明: int * pax[2];//创建两个指向单个 int 值的指针
那么首先 [] 与 pax 结合,表示 pax 是包含两个某种元素的数组。然后和 * 结合,表示 pax 是两个指针组成的数组。最后,用 int 来定义,表示 pax 是由两个指向 int 值的指针构成的数组。这种声明会创建两个指向单个 int 值的指针。
2.3指针赋值事项
把 const 指针赋给非 const 指针是错误的,因为可能会使用新指针来改变 const 数据。
但是把 const 指针赋给 const 指针是允许的,这样赋值有一个前提:只进行一层间接运算。
例:
int * p1;
const int * p2;
const int ** p3;
p1 = p2; //非法,把const指针赋给非const指针
p2 = p1; //合法,把非const指针赋给const指针
p3 = &p1; //非法,把非const指针赋给const指针,进行多层间接运算
2.4函数和多维数组
一般的,声明N维数组的指针时,除了最左边的方括号可以留空之外,其他都需要填写数值。
int sum (int ar[][10][20][30], int rows);
等效原型表示: int sum(int (*ar)[10][20][30], int rows]);
此处 ar 指向一个 10*20*30 的 int 数组。