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("\n");

    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