可以使用数组后面第一个元素的地址吗?
你可以使用数组后面第一个元素的地址,但你不可以查看该地址中的值。对大多数编译程序来说,如果你写如下语句:
int i,a[MAX],j;
那么i和j都有可能存放在数组a最后一个元素后面的地址中。为了判断跟在数组a后面的是i还是j,你可以把i或j的地址和数组a后面第一个元素的地址进行比较,即判断"&i==&a[MAX]"或"&j==&a[MAX]"是否为真。这种方法通常可行,但不能保证。
问题的关键是:如果你将某些数据存入a[MAX]中,往往就会破坏原来紧跟在数组a后面的数据。即使查看a[MAX]的值也是应该避免的,尽管这样做一般不会引出什么问题。
为什么在C程序中有时要用到&a[MAX]呢?因为很多C程序员习惯通过指针遍历一个数组中的所有元素,即用
for(i=0;i<MAX;++i)
{
/*do something*/
}
代替
for(p=a; p<&a[MAX];++p)
{
/*do something*/
}
这种方式在已有的C程序中是随处可见的,因此ANSIC标准规定这种方式是可行的。
int i,a[MAX],j;
那么i和j都有可能存放在数组a最后一个元素后面的地址中。为了判断跟在数组a后面的是i还是j,你可以把i或j的地址和数组a后面第一个元素的地址进行比较,即判断"&i==&a[MAX]"或"&j==&a[MAX]"是否为真。这种方法通常可行,但不能保证。
问题的关键是:如果你将某些数据存入a[MAX]中,往往就会破坏原来紧跟在数组a后面的数据。即使查看a[MAX]的值也是应该避免的,尽管这样做一般不会引出什么问题。
为什么在C程序中有时要用到&a[MAX]呢?因为很多C程序员习惯通过指针遍历一个数组中的所有元素,即用
for(i=0;i<MAX;++i)
{
/*do something*/
}
代替
for(p=a; p<&a[MAX];++p)
{
/*do something*/
}
这种方式在已有的C程序中是随处可见的,因此ANSIC标准规定这种方式是可行的。