17.数组
①
在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。
在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。
数组的几个名字:
1)数组:一组具有相同数据类型的数据的有序的集合;
2)数组元素:构成数组的数据。
3)数组的下标:是数组的位置的一个索引或指示;
4)数组的维数:数组元素下标的个数。根据数组的维数可以氛围一维、二维、三维、多维数组。
②按存储的内容分类
1)数值数组:用来存储数值
2)字符数组:用来存储字符'a'
3)指针数组:用来存放指针(地址)
4)结构数组:用来存放一个结构体类型的数据
③数组定义的注意事项
1)数组长度可以是一个常量,也可以是一个常量表达式;
2)数祖名的命名规则:严格按照标识符的命名规范;
3)数祖名不能和其他变量同名;
4)数组的长度不可以为一个变量(C99标准要求),但在Xcode优化下可以;
5)数组的长度可以使用 宏定义 #define M 5; int a[M];
6)在定义数组的时候,还可以定义普通变量。 int x,y,a[];
④数组的初始化
1)定义同时完全初始化,int a[3] = {1,2,3}; 或者 int a[] = {1,2,3,4}; 注意:不允许int len =3; int a[len] = {1,2,3};
2)定义同时部分初始化, int a1[3] = {1,2}; 或者 int a1[10] = {[3]=23,[8]=34};(表示下标为3,初值为23;下标为8,初值为34)
3)先定义,然后在初始化,int a2[2]; a2[1]=1; a2[2]=2;
如果定义了数组,不进行初始化,里面的值为随机的垃圾数;如果进行部分初始化,没有初始化那部分元素自动被系统初始化为0;
特别强调:使用先定义后初始化的方式,如果部分初始化,系统不会对未初始化的那部分元素进行赋值0的操作。
⑤数组的引用
数组元素是组成数组的基本单元。数组元素也是一种变量。其标识方法为数祖名后跟一个下标。下标表示了元素在数组中的顺序号;
如果要逐个访问数组的元素的话,这就叫数组的遍历。
⑥数组的存储方式
1)计算机会给数组分配一块连续的存储空间;
2)数组名代表数组的首地址,从首地址位置,依次存入数组的第1个、第2个....、第n个元素;
3)每个元素占用的相同的字节数(取决于数组类型);
4)并且元素之间的地址是连续的;
char字符是以他们的ascll码值进行存储的,先分配的数组地址高。数组地址可以不连续,数组各元素的地址一定是连续的。
&a[0]第一个元素的地址,a[0]第一个元素的值
⑦一维数组长度计算方法
int a[] = {1,2,3,4,5}; int len = 0;
len = sizeof(a) / sizeof(int);
⑧数组名作为函数参数
在C语言中,数祖名除作变量的标识符之外,数组名还代表了该数组在内存中的起始地址,因此,当数组名作函数参数时,实参和形参之间不是“值传递",而是“地址传递” ,实参数组名将该数组的起始地址传递给形参数组,两个数组共享一段内存单元,编译系统不再为形参数组分配存储单元。
注意点:
1)形参数组的类型和长度要和实参一致;
2)形参的数组长度和实参的长度可以不一致,虽不会报错,运行的结果和实际不相符;
3)形参数组的长度可以不写;
4)数祖名作为函数参数后,数组的长度信息丢失:在C语言中规定,不管什么类型的数据,数据的内存地址在内存中占用8个字节;
18.冒泡排序(Bubble Sort)
冒泡排序分为:大数下沉、小数上浮
//大数下沉
for (int i = 0; i<len - 1; i++) {
for (int j = 0; j < len-1-i; j++) {
if (a[j] > a[j+1]) {
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
for (int i = 0; i < len; i++) {
printf("%d ",a[i]);
}
printf("\n");
}
printf("\n");
}
//小数上浮
for (int i = 0; i < len-1; i++) {
for (int j = 0; j < len-1-i; j++) {
if(a[j+1]<a[j]){
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
for (int i = 0; i < len; i++) {
printf("%d ",a[i]);
}
printf("\n");
}
printf("\n");
}