我们在前面使用const创建过变量
const double PI =3.14159;
#define可以创建类似功能的符号常量,但是const的用法更加灵活,可以创建const 数组 const指针和指向const 的指针。
我们使用最小的数组,假设有下面的声明
int zippo[4][2];//内涵int 数组的数组
然后数组名zippo是该数组首元素的地址,在本列中,zippo的元素首要是一个内涵两个int 值的数组,所以zippo是这个内涵两个int值的地址。
因为zippo是数组首元素的地址,所以zippo的值和 &zippo[0]的值相同。而zippo[0]本身是一个内涵两个正式的数组,所以zippo[0]的值和他首元素(一个整数)的地址(&zippo[0][0]的值)相同。简而言之,zippo[o]是一个占用一个int对象大小的地址二zippo是一个占用两个int大小对象的地址。由于整数和内涵连个数组都开始于同一个地址,所以zippo和zippo[0]的值相同。
给指针或地址加1,其值会增加对应类型大小的数组。在这方面,zippo和zippo[0]不同,因为zipppo指向对象占用了两个int 大小,而zippo[0]只想的对象只占用了一个int大小,因此zippo+1和zippo[0]+1的值不同。
解引用一个指针(在指针前运用*运算符)或在数组后使用带下标的[]运算符,得到引用对象代表的值,因为zippo[0]是该数组首元素(zippo[0][0])的地址,所以*(zippo[0]表示储存在zippo[0]上的一个值。
//zippol.c--与zippo相关的函数
#include <stdio.h>
int main(void)
{
int zippo[4][2] = { {2,4},{6,8},{1,3},{5,7} };
printf("zippo=%p,zippo+1=%p\n", zippo, zippo + 1);
printf("zippo[0]=%p,zippo[0]+1=%p\n", zippo[0], zippo[0] + 1);
printf("*zippo=%p,*zippo+1=%p\n", *zippo, *zippo + 1);
printf("zippo[0][0]=%d\n", zippo[0][0]);
printf("*zippo[0]=%d\n", *zippo[0]);
printf("**zippo=%d\n", **zippo);
printf("zippo[2][1]=%d\n", zippo[2][1]);
printf("*(*(zippo+2)+1)=%d\n", (*(*(zippo + 2) + 1)));
return 0;
}
运行结果如
其他系统显示的地址值和地址形式可能不同,但是地址之间的关系与以上输出相同。该输出显示了一堆数组zippo的是和一堆数组zippo[0]的地址相同,他们的地址都是各自数组首元素的地址,因而与&zippo[0][0]的值也相同。
zippo 二维数组首元素的地址(每个元素都是内涵两个int类型元素的一维数组)
zippo+2 二维数组的第三个元素(既一位数组的地址)
*(zippo+2) 二维数组的第三个元素(既一位数组)的首元素(一个int类型的值)的地址
*(zippo+2)+1 二维数组第三个元素(既一维数组)的第二个元素(也是一个int类型的值)地址
*(*(zippo+2)+1) 二维数组的第三个一维数组元素的额第二个int类型元素的的值,既数组的额第三行第二列的值
上面的而分析是为了说明用指针表示法(*(*(zippo+2)+1))代替数组表示法(zippo[2][1]),而是提示读者,如果程序恰巧使用一个指向而位数组的指针,而且要通过该指针获取值时,最好用简单的 数组表示法,而不是指针表示法。
指向多维数组的指针
指针的兼容性
函数和多维数组