------ Java培训、Android培训、iOS培训、.Net培训期待与您交流! ------
http://www.itheima.com
一维数组:属于构造类型,是具有一定顺序关系的若干相同类型变量的集合。
注意点:
- 定义格式:类型说明符 数组名 [数组长度]
- 数组的长度是可以是一个常量 也可以是常量表达式。
- 数组名的命名规则:严格按照标识符的命名规范。
- 数组名不能和其他变量同名。
- 数组的长度可以使用 宏定义,int a6[N];其中N是一个宏定义。
- 定义数组的时候,还可以定义普通变量,例如 int x,a[4];。
- 编译时连续分配内存,数组的总字节=数组长度x元素字节;数组的长度=数组的总字节 /元素字节。
- 数组名表示内存首地址,是地址常量。
- 数组元素表示形式: 数组名[下标],其中下标可以是常量或常量表达式。
- 数组初始化:1、定义的同时进行初始化:(1)定义的同时完全初始化,例如int a[3]={1,2,3};(2)定义的同时进行部分初始化,例如int a1[3]={1,23}以及int a2[10]={[2]=34,[5]=30};其中没有被初始化的元素系统自动赋值为0。2、先定义数组,然后通过下标法进行初始化,例如int a[3]; a[0] = 67; a[1] = 34;a[2] = 12;这种先定义后初始化的情况下,如果部分数组元素被初始化了,剩下的元素不会被自动初始化为0。
- 只能逐个引用数组元素,不能一次引用整个数组,例如int a[5];printf(“%d”,a);错误。
- 数组的遍历:逐个访问数组的元素,利用for循环。例如下面程序通过for循环初始化数组然后逆序输出数组。
#include <stdio.h>
int main(int argc, const char * argv[])
{ int i,a[11];
for(i=0;i<=10;i++)
a[i]=i;
for(i=10;i>=0;i--)
printf(“%d”,a[i]);
return 0;
}
- 注意数组的越界问题,例如
#include <stdio.h>
int main(int argc, const char * argv[]) {
char a[2];
a[0]='a';
a[1]='b';
a[2]='c';
printf("%c",a[2]);
return 0;
}系统不会报错,但是这个空间不属于该字符数组,所以是不安全的。
- 数组元素作为函数的参数:用数组名作为函数实参,传递的是地址;形参数组的类型、长度要和实参数组的类型、长度一致,形参数组的长度可以不写;不管什么类型的数据,数据的内存地址在内存中占用8个字节。如以下程序:
#include <stdio.h>
//形参数组的类型、长度和实参数组的类型、长度一致,其中数组长度可以不写
void test(int arr[],int len1){
//数组名作为函数参数,传递的是地址,计算地址的字节数
int len2=sizeof(arr);
//数据的内存地址在内存中占用8个字节
printf("%d\n",len2);//输出结果为8
//遍历数组
for (int i=0; i<len1; i++) {
printf("%d\t",arr[i]);
}
printf("\n");
}
int main(int argc,constchar * argv[]) {
//定义同时初始化数组
int a[5]={1,2,3,4,5};
//调用函数
test(a, 5);
return 0;
}
- 冒泡排序思想:(1)比较第一个数与第二个数,若a[0]>a[1],则交换,然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止,经过第一趟排序最大的数被安置在最后一个元素位置上;(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置;(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束,注意内外层循环次数的控制。
- 选择排序思想:首先通过n-1次比较,从n个数中找出最小的, 将它与第一个数交换,经过第一趟选择排序,结果最小的数被安置在第一个元素位置上;再通过n-2次比较,从剩余的n-1个数中找出次小的数,将它与第二个数交换,经过第二趟选择排序,结果次小的数被安置在第二个元素位置上;重复上述过程,共经过n-1趟排序后,排序结束。注意内外层循环次数的控制。