数组
1. 定义数组大小 const int 也可以
2. 初始化 int count [100] = {0} 还有 int count [] = {[1]=3,[5]=9} 0 3 0 0 0 9
3. 赋值
4. 遍历
- sizeof () 给出整个数组所占据的内容的大小,单位是字节
#include<stdio.h> int main(){ int count [10] = {[1] = 3,[4] = 3}; for(int i = 0 ; i < sizeof(count)/sizeof(count[0]);i++){ printf("%d ",count[i]); } return 0; }
- 数组不能赋值给另外一个数组 int a [] = {}; int b[] = a; 错误 需要通过遍历赋值
- 当我们将数组作为参数时,往往必须再用另一个参数来传入数组大小 int search(int key, int a[] , int length){...} 不能利用sizeof来获取数组长度
#include<stdio.h> void search(int a[]){ for(int i = 0 ; i < sizeof(a)/sizeof(a[0]);i++){ printf("%d ",a[i]); //0 3 错 } } int main(){ int count [10] = {[1] = 3,[4] = 3}; search(count); return 0; }
- 数组单元在内存中是连续存放的
#include <stdio.h> #include <stdlib.h> int main() { int a[10] = {0}; int i = 0; printf("int类型占用内存%d个字节.\n", sizeof(a[0]) ); for ( i = 0; i < 10; ++i) { printf("a[%d]的地址是%X\n", i, &a[i] ); } return 0; } 输出结果 int类型占用内存4个字节 a[0]的地址是0X22FEF4 a[1]的地址是0X22FEF8 a[2]的地址是0X22FEFC a[3]的地址是0X22FF00 a[4]的地址是0X22FF04 a[5]的地址是0X22FF08 a[6]的地址是0X22FF0C a[7]的地址是0X22FF10 a[8]的地址是0X22FF14 a[9]的地址是0X22FF18 可以看出在内存中是连续存储的。
- 二维数组 a[i,j] = a[j] 逗号运算符
数组可以存放在变量里,每一个变量都有自己的名字,有一个类型,还有它的生存空间。如果我们需要保存一些相同类型、相似含义、相同生存空间的数据,我们可以用数组来保存来保存这些数据,而不是用很多独立的变量。
数组是长度固定的数据结构,用来存储指定的数据。一个数组可以有很多个数据,所有数据的类型都是相同的。
- 没有数组求平均数
#include <stdio.h> int main (){ int x ; double sum = 0 ; int cnt = 0; scanf("%d",&x); while(x!=-1){ sum += x; cnt++; scanf("%d",&x); } if(cnt!=0)printf("%f\n",sum/cnt); return 0; }
- 数组解决所有数大于平均数
#include <stdio.h> int main (){ int x[100] ; //安全隐患 a 可能会大于100; double sum = 0 ; scanf("%d",&x[0]); int a = 0; while(x[a]!=-1){ sum += x[a]; a++; scanf("%d",&x[a]); } double temp = sum/a; printf("%f\n",temp); int i ; for (i = 0 ; i <= a ; i++ ){ if(x[i]<=temp)printf("%d\n",x[i]); } return 0; }
定义数组【容器】+ 初始化!!!!
<类型> 变量名称[元素数量];
C99之前:元素数量必须是编译时刻确定的字面量 不能是变量,C99后就可以int a [b]
- 是一种容器(放东西的东西)
- 其中所有的元素具有相同的数据类型
- 一旦创建,不能改变大小
- 数组中元素在内存是中是连续依次排序的
- 从0开始,编译器省了很多工作
有效的下标范围
- 编译器和运行环境都不会检查数组下标是否越界,无论是对数组单元做读还是写
- 一旦程序运行,越界的数组访问可能会造成问题,导致程序奔溃
- segmentation fault
- 但是可能运气好,没造成严重后果
- 所以这是程序员的责任来保证程序只使用有效下标值:[0...数组大小-1]
- 数组建立后要进行初始化,如果数组里的值都是无法预测的。越界是可以继续运行的 a[10] = 一个未知数 a[10] = 1 会报错
- 可以创建长度为0 的数组 可以存在,但是无用
for(int i=0;i<9;i++) 在c语言中是错误的?
答:C99标准以前的C标准是不支持临时变量在for循环中定义的,C99标准就支持这样写。但是目前有些编译器并不怎么愿意支持C99标准,或者默认以C89模式进行编译执行。
数组运算
初始化
- int arr[] = {1,2,3,4,5}
- 初始化 for () {}
- int arr [!=1] ={0}
- int arr[][5] = {{0,1,2,3,4},{5,6,7,8,9}}; 初始化
- 列数是必须要给出的,行数可以由编译器得出
i,j => j
- 从2到x-1
- 从2到sqrt(x)
- 拿比x小的所有素数进行判断
- 构造一个素数表