这个语句还可以进一步写成:
i = *(*(calendar+4)+7);
从这里我们不难发现,用方括号的下标形式很明显地要比指针来表达简便得多。下面我们再看:
p = calendar;
这个语句是非法的,因为calendar是一个二维数组,即数组的数组,在此处的上下文中使用calendar名称会将其转化为一个指向数组的指针,而p是一个指向整型变量的指针,这个语句试图将一个类型的指针赋值给另一种类型的指针,所以是非法的。
很显然,我们需要一种声明指向数组的指针的方法,经过了前面对类似问题不厌其烦的讨论,构造出下面的语句应该不需要废多大力气:
int (*ap)[31];
这个语句的效果是,声明了*ap是一个拥有三十一个整型元素的数组ap就是一个指向这样的数组的指针,因而我们可以这样写:
int(*monthp)[31];
Monthp = calendar;
这样,monthp将指向数组calendar的第一个元素,也就是数组calendar的12个有着31个元素的数组类型元素之一。
假定在新的一年开始时,我们需要清空calendar数组,用下标形式可以很容易做到:
int month;
for(month=0;month < 12;month++){
int day;
for(day=0; day < 31;day++)
calendar[month][day]=0;
}
上面的代码段如果才用指针应该如何表示呢?我们很容易地把 calendar[month][day]=0; 表示为*(*(calendar+month)+day)=0;
但是真正有关的部分是哪些呢?
如果指针monthp指向一个拥有31个整型元素的数组,而calendar的元素也是一个拥有31个整型元素的数组,因此就像是在其他情况中我们可以使用一个指针遍历一个数组一样,这里我们同样可以使用指针monthp以步进的方式遍历数组calendar:
int (*monthp)[31];
for(monthp=calendar;monthp < &calendar[12];monthp++){
int *dayp;
for(dayp=*monthp;dayp < &(*monthp)[31];dayp++)
*dayp=0;
}
注:相关教程知识阅读请移步到C++教程频道。










