#define MONTHS 12
int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
int index;
for (index = 0; index < MONTHS; index++) {
printf("Month %d has %2d days.\n",index + 1,days[index]);
}
首先定义宏常量MONTHS 为12
然后以int days[MONTHS]定义数组,实际这个数组为int days[12],数组内容以{}进行包裹,逗号间隔
使用一个简单的for循环进行遍历
关于输出行为index + 1,是因为数组下标是从0开始计算的,即实际上为0~11
days[index]则是通过下标进行数组内容的取出
注意:如果数组未经初始化,那么其中的值是不定的,如果初始化后,但是数值数目少于数组元素个数时,多余的元素会被初始化为0
int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
int index;
const int count = sizeof(days)/sizeof(days[0]);
for (index = 0; index < count; index++) {
printf("Month %d has %2d days.\n",index + 1,days[index]);
}
printf("count:%d\n",count);
由于人工计算数组长度容易出错,所以在上面的代码进行了一些修改
定义一个count使用sizeof 数组/sizeof 数组单个元素来计算数组中的元素个数
关于const关键字,由于int count不需要进行更改,所以定义为常量
#define MONTHS 12
int one[MONTHS] = {5,6,7,8};
int two[MONTHS];
two = one;//不允许
two[MONTHS] = one[MONTHS];//不正确
two[MONTHS] = {5,6,7,8};//不起作用
在上述代码中,表示了几种数组常见的错误
int arr[5][12] = {
{1987},
{1988},
{1989},
{1990},
};
int count = sizeof(arr)/sizeof(arr[0]);
int sizeCount = sizeof(arr[0])/sizeof(arr[0][0]);
printf("count:%d sizeCount:%d\n",count,sizeCount);
for (int i = 0;i < count;i++) {
for (int j = 0; j<sizeCount; j++) {
printf("arr[%d][%d]:%d\n",i,j,arr[i][j]);
}
}
上述代码展示了一个二维数组的初始化到遍历的过程
初始化中,以{}包裹{}并以,分割
当然,和普通数组一样,初始化中未使用的值会初始化为0
另外,还有三维数组,int arr[5][6][7] 可以理解为5个二维[6][7]数组
void testArray(int arr[],int f);
int main(int argc, const char * argv[]) {
int arr[5] = {2,3,4,5};
testArray(arr,5);
int size = sizeof(arr);
printf("---- %d\n",size);
return 0;
}
void testArray(int arr[],int f){
int size = sizeof(*arr);
for (int i = 0; i < f; i++) {
printf("arr:%d,%d\n",arr[i],size);
}
}
上面的代码中函数中使用sizeof无法取得传入数组的完整大小
因为当把数组作为函数的参数时,你无法在程序运行时通过数组参数本身告诉函数该数组的大小,因为函数的数组参数相当于指向该数组第一个元素的指针。
必须通过附加一个int长度来进行传送 |