数组
【1】一维数组
0.数组类型 是 由多个元素的组合。
这多个元素的数据类型必须完全一样。
1.数组是一个构造类型,也是最基础的构造类型了。
2.数组的个数如下
char a[5]; char 是所有元素的数据类型。全部都是char
a是数组名,a是常量(但是不能执行a++/a--/++a/--a)
[5] 数组有五个成员,分别是:
a[0] a[1] a[2] a[3] a[4]
//2020-8-27 上次听别人讲,数组也可以认为是指针,
//因为他代表的也是地址,但是他不可以像指针一样进行加减的操作。
3.数组在内存上是连续的.
4.数组不会对越界进行检查
a[5] = 10;
/*编译器不会包错误,但是内存已经越界了
( 因为char a[5] 最大是a[4])
这个在《C陷阱与缺陷》讲解的比较清晰
*/
5.数组名就是数组的首地址
(这个很类似指针,所以有时候,也讲 数组是指针)
6.a+1 &a+1 &a[0]+1 移动的为对应类型的大小。
数组赋值:
1.定义时候赋值
int a[5] = {1,2,3,4,5};
int a[5] = {1,2,};
int a[5] = {0};
int a[] = {1,2,3,4,5};
//数组大小根据初始化的元素的个数决定
2.先定义后赋值
int a[5];
for(i=0; i<5; i++){
a[i] = i;
}
遍历:
for(i=0; i<sizeof(a)/sizeof(a[0]); i++){
printf("a[%d] = %d,&a[%d] = %p\n",i,a[i],i,&a[i]);
printf("a = %d\n",a[i]);
}
练习:
1.从终端上输入10元素,将这十个元素排序(冒泡)
输入:10 30 1 5 34 4 8 16 100 25
输出:1 4 5 8 10 16 25 30 34 100
冒泡排序:
拿相邻的两个元素进行比较,如果前面的元素大于后面的
元素,让这两个元素进行交换位置,否则不交换。
2.快速排序(对冒泡排序的优化)
原理(个人):以第一个数作为轴线,从右向左比较如果后者小就二者交换,如果遇到
交换就变换方向,从左向右比较,如果左侧值大于轴线值则交换,并在此改变比较方向。
第一轮比较的结果为轴线左边的全部小于轴线值,轴线右边的全部大于轴线值。然后递归
再从左侧选出轴线,从右侧选出轴线,依次比较即可。
1.选择轴值,一般是选取第一个元素的关键码。有一个快排的最坏情况就是如果待
排序元素是正序或者逆序,就会将除轴值以外的元素分到轴值的一边。
2.划分
①、设置划分区间:i=first,j=end
②、执行右侧扫描,直到r[j]小于轴值,将r[j]与r[i]交换,i++
③、执行左侧扫描,直到r[i]大于轴值,将r[i]与r[j]交换,j–
④、重复二到三直到i=j,确定看轴值的所在位置,返回该位置
注意:
1.数组名是常量 杜绝a++; 可以a+1
2.数组不会对越界检查
练习:
1.从终端上输入10元素,将这十个元素排序(冒泡)
输入:10 30 1 5 34 4 8 16 100 25
输出:1 4 5 8 10 16 25 30 34 100
冒泡排序:
拿相邻的两个元素进行比较,如果前面的元素大于后面的
元素,让这两个元素进行交换位置,否则不交换。
int i,j;
i 比较的趟数 N - 1;
j 同一趟内比较的次数 N - 1 - i
2.使用选择排序
每次从数组中取出第一个元素和后面每一个元素进行比较,
循环一次后找到最小数的下标,然后循环一轮后进行数值的
交换,直到所有的数都被遍历一遍。
int i,j;
i 比较的趟数 N - 1;
j 同一趟内比较的次数 起始条件i+1 结束条件N
【2】二维数组
int [2];
int a[3] [2];
| |
行数 列数
a[0] 行
a[0][0] a[0][1]
a[1]
a[1][0] a[1][1]
a[2]
a[2][0] a[2][1]
初始化
1.定义时初始化
int a[3][2] = {1,2,3,4,5,6};
int a[3][2] = {{1,2},{3,4},{5,6}};
int a[3][2] = {0};
int a[3][2] = {{1,},{3,},{5,}};
int a[][2] = {{1,2},{3,4},{5,6}};
注意:
1.行号可以省略,列号不能省略
2.二维数组名也是一个常量,它不能做如下操作a++
2.先定义后初始化
int a[3][2];
for(i=0;i<3;i++){
for(j=0;j<2;j++)
a[i][j] = 5;
}
练习:
1.打印杨辉三角(前10行)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
int a[10][10]
2.输入12个数,找到最大数的横坐标和纵坐标
int [4][3];
【3】一维字符数组
char a[3];
a[0] a[1] a[2]
赋值方式
char a[] = {'h','e','l','l','o','\0','e'};
char b[10] = "hello";
遍历方式
for(i=0; i<10; i++){
putchar(a[i]);
}
puts("");
printf("%s\n",a); //%s遇到'\0'才会结束
练习:
1.拷贝strcpy //将一个数组的内容拷贝到另外一个数组中
2.追加strcat //将一个数组的内容追加到另外一个数组的尾部
3.比较strcmp
4.长度strlen
【4】二维字符数组
char a[10][10];
char a[][10] = {{"hello"},{"world"},{"test"}};
for(i=0; i<3; i++){
printf("%s\n",a[i]);
}
for(i=0; i<3; i++){
for(j=0; j<10; j++){
putchar(a[i][j]);
}
puts("");
}
2020-8-27
回首再看这一章,陈旭,你发现了什么?
数组是使用最多的一个了。
在后面的结构体中,在结构体中加入数组元素,也是非常的常见的一种思路。我需要做什么?我可能需要先学习一段时间了,这样是最好的选择。