数组本质上是一种容器
1.数组本质上是一种容器(放东西的东西),特点:
.其中所有的元素具有相同的数据类型.
.一旦创建不能改变大小.
.数组中的元素在内存中是连续依次排列的.
2.有效的下表范围:
.编译器和运行环境都不会检查数组下标是否越界,无
论对数组单元做读还是写.
3.可以定义长度为0的数组,例如:int a[0]; 但是没有
用,没有有效的下标.时
4.数组实例:
写一个程序,输入数量不确定的[ 0-9 ] 范围内的整数,统计每一种数字出现的次数,输入-1表示结束.[ 1-1.cpp ]
分析:在输入整数的同时就对数进行判断即可,不需要将存入的整数保存,对输入的每个数字的次数可用数组表示,数组的下标可用当前输入的数字.
#include <stdio.h>
int main()
{
int cnt, number[cnt];
int flag;
printf("Please input a number!\n");
scanf("%d", &cnt);
printf("Please input your numbers of 0-9!\n");
for(int i=0; i<cnt; i++)
{
scanf("%d", &number[i]);
if((number[i]<0 && number[i]!=-1) || number[i]>9)
{
printf("\tError,Please input this number again!\n");
i--;
}
else if(number[i] == -1)
{
flag = 1;
break;
}
}
for(int i=0; i<=9; i++)
{
if(flag == 1)
break;
else
{
int a[9] = {0};
for(int j=0; j<cnt; j++)
{
if(number[j] == i)
a[i]++;
}
printf("%d出现的次数:%d\n", i, a[i]);
}
}
return 0;
}
课程给出的代码:
#include <stdio.h>
int main()
{
const int number = 10;
int x;
scanf("%d", &x);
int count[number];
for(int i=0; i <number; i++)
{
count[i] = 0;
}
while(x != -1)
{
if(x>=0 && x <=9)
count[x]++;
scanf("%d", &x);
}
for(int i=0; i<number; i++)
{
printf("%d:%d\n", i, count[i]);
}
return 0;
}
5.数组的集成初始化时的定位 [ Only C99 ].(但是
gcc编译不能通过)[1-2.cpp]
int a[10] = { [0] =2, [2]=3, 6, };
.用[n]在初始化数据中给出定位;
.没有定位的数据接在前面的位置后面;
.其他的位置补0;
.可以不给出数组的大小,让编译器算;
.特别适合初始化数据稀疏的数组;
#include <stdio.h>
int main()
{
int a[4]={
[0]=1, [3]=4};
{
int i;
for(i=0; i<4; i++)
printf("%d\t", a[i]);
}
return 0;
}
6.数组的大小
.sizeof()给出整个数组所占内存的大小,单位是字节,而数组中元素的个数:
sizeof(a) / sizeof( a[0] )
.sizeof(a[0])给出数组中单个元素的大小,于是相除就得
到了数组单元个数.
.这样的代码,一旦修改了数组中初始数据的个数,计算
个数的公式 sizeof(a) / sizeof( a[0] ) 仍然正确.
[ 1-3.cpp ]
习惯:70-80年代数组初始化最后一个元素多出一个
',',但是对编译没有任何影响.
#include <stdio.h>
int main()
{
/*int a[]={
1,2,3,4,5,6,7,8,9,0,
};
*/
int a[]={
1,2,3,4,5,6,
};
printf("%d\n", sizeof(a)/sizeof(a[0]));
return 0;
}