C语言不要求检查下标的范围。当下标超出范围时,程序可能会执行不可预知的行为。
看下这个程序:
#include <stdio.h> #define N 10 // int main() { int a[N],i; printf("Enter %d numbers: ",N); for(i=0; i<N; i++) scanf("%d",&a[i]); printf("In reverse order:"); for(i=N-1; i>=0; i--) { printf("% d ",a[i]); } printf(" "); return 0; }
程序一共4次使用到了宏N:在数组a的声明中,在显示提示的printf函数中,还有两个for循环
可以随意改变N的值,方便,为宏定义的优越性
在看这一个:
#include <stdio.h> int main() { int i,n; scanf("%d",&n); int a[n]; printf("Ebter %d numbers:",n); for(i=0; i<n; i++) scanf("%d",&a[i]); printf("In reverse order:"); for(i=n-1; i>=0; i--) printf(" %d ",a[i]); return 0; }
你认为有错吗?
对错在于C89与C99的差别
这种方法为C99的变长数组,可以动态输入
C99中,可以指定初始化式,如
int a[15] = {0,0,29,0,0,0,0,0,0,7,0,0,0,0,48};
由于希望元素2为29,元素9为7,元素14为48,而其他全部为0.对于大数组可能会出错
C99中可以这样赋值
int a[15] = {[14] = 48,[9] = 7,[2] = 29};
除了可以使赋值变得更简短,更易读之外,赋值的顺序不再是问题
也可以这样
int a[15] = {[14] = 29,[9] = 7,[14] = 48};
括号中的数字为指示符
指示符必须为整形常量表达式。如果待初始化的数组长度为n则每个指示符的值都必须在0到n-1之间。
但是,如果数组长度是省略的,指示符可以使任意非负整数;对于后一者情况,编译器将根据最大的指示符推断出数组的长度。
如,指示符的最大值是23,因此数组的长度是24
int b[] = {[5] = 10,[23] = 13, [11] = 36, [15] = 29};
未指定的默认为0