1.给指针操作提供更多的空间
下面看例子:
#include<stdio.h>
int main(){
int array[5]={1,2,3,4,5};
int* parray=array+2;
printf("%d",parray[-1]);
return 0;
}
如果检查数组下标,上面这种就相当于是非法操作,编译器是无法通过的!这也是C语言的强大之处,使用起来非常灵活。
再比如:
#include<stdio.h>
int main(){
int array[5]={1,2,3,4,5};
int* parray=array;
printf("%d",2[parray]);
return 0;
}
2[parray]等价于parray[2],语法方面C语言默认它是正确的。
所以,C语言不对数组下标进行有效性检查,一方面是C本身就是非常灵活的语言,另一方面就是大大发挥指针的作用。
2.数组名只提供地址信息
数组名仅仅提供数组元素的首地址,不会提供数组长度的信息。所以某些函数需要用到数组长度时,可以通过参数传值传进去。
void fun(int array[],int maxsize){
printf("可能需要数组长度的信息");
}
3.降低运行效率
如果要检查数组下标有效性,编译器要在源代码编译完成之后生成的object代码里加入相关指令,用来判断数组下标是否越界以及相关指针所操作的元素是不是数组上的同一个元素,这不仅仅要耗费大量的时间,还要占用额外的空间。所以一般编译器为了提高运行效率,不会检查数组下标的有效性,有的编译器用检查数组下标的选项,也往往会提示程序员是否需要跳过此步骤。所以,数组下标的检查就往往成为了程序员的任务,确保不能非法访问其他未知内存的基础上让指针操作更加灵活。