1,数组是有一系列相同元素构成的。

2,const int abc[MONTH] = {1,2,3,4,5,6,7};  //  需要在const声明数组时对其进行初始化,因为在声明后,不能再对其进行赋值。

3,当使用空的方括号对数组进行初始化时,编译器会根据列表中的数值来确定数组的大小。

确定数组的元素的个数:sizeof(abc)/sizeof(abc[0]); 

C99对数组初始化增加了一些新特性,可以对某个元素专门初始化,例如:abc[6] = {abc[5] = 123};

还有,如果在一个指定初始化项目后跟有不止一个值,则这些数值经用来对后续的数组元素初始化;第二,如果多次对一个元素初始化,则最后一次有效。

为数组赋值:

C不支持把数组作为一个整体来赋值,也不支持用花括号括起来的列表形式进行赋值(初始化的时候除外)。

#define SIZE 5

int oxen[SIZE] = {1,3,4,5};  //可以的

int yaks[SIZE];

yaks  = oxen;  //不允许

yake  = oxen;  //不允许

yake[SIZE] = oxen[SIZE];  /不正确

yake[SIZE] = {1,3,4,5};   //不起作用

编译器不检查索引的合法性。

数组名也是该数组首元素的地址;

例如:

#include 
#define MONTH 12

int main(void)
{
    int days[MONTH] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int index;
    for(index = 0;index < MONTH;index++)
        printf("month %d has %d days.\n",index + 1,*(days + index);
    return 0;
}
/*   与days[index]相同  */

函数原型:就是函数声明,函数原型不是必须的,如果函数定义在这个函数使用之前,那么就不需要函数原型,也就是函数声明。因为函数原型是一条语句,所以要加分号,函数原型包括函数的返回值类型,函数名,参数列表,还有一点就是函数原型一定要与函数定义一致,否则后果不堪设想,哈哈。

函数,数组,指针:

int sum(int * ar,int n)   //更通用的做法

这里的第一个参数把数组地址和数组类型传给了第一个参数,第二个参数传的是数组元素的个数。

只有在函数原型和函数定义头中,ar[] 和*ar 才可以互换。

无论任何情况,int *ar永远代表ar是指向int 的指针。ar[]也可以表示ar是指向int的指针,但必须是在函数声明或是函数定义头当中才可以。

所以以下都是等价的:

int abc[char * pr,int n);

int abc[char pr[],int n);

int abc[char *,int);

int abc[char [],int);

如果在函数定义中,这样就是等价的:

int abc[char * pr,int n)

int abc[char pr[],int n)