C语言程序设计:数组
数组
定义数组
- <类型> 变量名称[元素数量];
int grades[100];
double weight[20];
- 元素数量必须是整数
- C99之前:元素数量必须是编译时刻确定的字面量
数组是什么
数组是一种容器,它具有的特点是:
容器是现代程序设计中非常重要的一个概念,或者说现代编程语言都应该提供某种形式的容器,或者说语言所提供的容器的能力的大小是评判语言能力大小的重要标准。
- 其中所有元素具有相同的数据类型
- 一旦创建,不能改变大小
- 在内存中,数组的元素是紧密依次排列的
数组的单元
-
数组的每个单元就是数组类型的一个变量
-
使用数组时放在
[]
中的数字叫做下标或者索引,下标从0开始计数:数组下标从0开始计数是由C语言始创的,因为这样可以让C语言的编译器简化很多操作。
- grades[0]
- grades[99]
- average[5]
有效的下标范围
- 编译器和运行环境都不会检查数组下标是否越界,无论是对数组单元做读还是写
- 一旦程序运行,越界的数组可能造成问题,导致程序崩溃
- segmentation fault
- 但是也可能运气好,没有造成严重的后果
- 所以程序员有必要保证程序只使用有效的下标值:[0,数组的大小-1]
长度为0的数组?
int a[0];
- 可以存在但无用
数组运算
数组的集成初始化
int a[] = {2,4,2,31,312,31,31,231,21,31,3}
-
直接给出数组所有元素的初始值
-
不需要给出数组大小,编译器会自动判断
-
若给出了数组大小,但后面的初始值数量不足,则其后的元素会被初始化为0
-
int[10] = { 2, 3}; PRINT: 2 3 0 0 0 0 0 0 0 0 0
-
集成初始化时的定位
int a[10] = {
[0] = 2, [2] = 3, 6 ,
};
- 用[n]在初始化数据中给出定位
- 没有定位的数据接在前面的位置后面
- 其他位置的值补零
- 也可以不给出数组大小,让编译器
- 算特别适合初始数据稀疏的数组
数组的大小
sizeof
会给出数组所占内容的大小,单位是字节- 因此数组的长度可以用
siezof(a)/sizeof(a[0])
来取得
数组作为函数参数时:
- 不能在[]中给出数组的大小
- 不能再利用
sizeof
来计算数组的元素个数!
数组的赋值
int a[] = {2,34,4,14,14,1,};
int b[] = a;
- 数组变量本身不能被赋值
- 要把一个数组的所有元素交给另一个数组,必须采用遍历
for(int i = 0; i<length; i++){
b[i] = a[i];
}
实例:判断素数
判断能否被已知且<X的素数整除
int isPrime(int x, int list[], int lenght);
int main(){
int i = 3, x, count = 1, list[100] = {
2};
scanf("%d", &x);
while(i < x){
if( isPrime(i, list, count) ){
list[count++] = i;
}
i++;
}
if( isPrime(x, list, count) ){
printf("%d是素数", x);
}else{
printf("%d不是素数", x);
}
}
int isPrime(int x, int list[], int lenght){
for(int i = 0; i < lenght; i++){
if(x % list[i] == 0){
return 0;
}
}
return 1;
}
构造素数表
- 构造N以内的素数表
- 令x为2
- 将2x3x4x直至ax<n的数标记为非素数
- 令x为下一个没有被标记为非素数的数,重复2;直到所有书到已经尝试完毕
int main(){
int n;
scanf("%d", &n);
int list[n];
for(int i = 0; i < n; i++){
list[i] = 1;
}
for(int x = 2; x < n; x++){
if( list[x] ){
for(int i = 2; x*i<n; i++){
list[x*i] = 0;
}
}
}
}