一维数组¶
接下来我们将从以下几个方面来学习一维数组
0x00 数组定义¶
一维数组声明定义的格式是:type ArrayName [ArraySize];
- type:数组元素的数据类型
- ArrayName:数组的数组名
- ArraySize:数组元素的数量
例如:int a[10];定义了一个名为a的数组,该数组有10个成员 每个成员都是int类型
- 该定义开辟了
sizeof(int)*10=40字节的连续内存空间,依次连续存放a[0]~a[9]10个元素 - 数组名
a是一个常量[不能当做变量被赋值],它代表数组首元素的地址 - 此时该数组并没有被初始化,每个元素的值是随机的
定义数组时,ArraySize可以是变量,其定义方法可以是
//方法一:c99之后的编译器才支持
int i = 10;
int a[i];
//方法二:标准c写法
#define NUM 10
int a[NUM];
注意:char a[10];
a表示数组首元素的地址,即a[0]元素的地址,a+1表示a[1]的地址&a表示整个数组的首地址,&a+1表示跳过了整个数组
0x01 数组初始化¶
当定义一个数组时只是分配了相应的内存空间,内存空间存储的依然是之前的随机值,此时需要通过初始化存放我们想要存储的数据;数组初始化的方式有:
int a[4] = {1,2,3,4};:a[0]~a[3]的值分别初始化为1,2,3,4;每个元素都占用4字节空间int a[4] = {1,3};:a[0]初始化为1,a[1]初始化为3,a[2]~a[3]初始为0;每个元素都占用4字节空间int a[] = {1,2,3};:数组a只有3个元素,分别初始化为1,2,3;每个元素都占用4字节空间int a[4] = {0};:a[0]~a[3]都初始化为0;每个元素都占用4字节空间char a[4] = {0}:a[0]~a[3]都初始好为0;每个元素都占用1字节空间char a[6] = "hello":a[0]~a[5]分别初始化为’h’/’e’/’l’/’l’/’o’/‘0’;每个元素占用1个字节。注意:数组元素的个数一定要大于字符串常量的长度,因为字符串是以‘0’结尾,”hello”实际是以’h’/’e’/’l’/’l’/’o’/‘0’存放的char a[10] = "hello":a[0]~a[5]分别初始化为’h’/’e’/’l’/’l’/’o’/‘0’,剩余元素都初始为0;每个元素都占用1个字节空间
0x02 数组访问¶
数组是通过索引下标的方式来访问元素的,以下demo代码就是访问数组每个元素然后打印输出
#include <stdio.h>
int main(){
int i;
int a[] = {1,2,3,4,5};
for(i=0; i < sizeof(a)/sizeof(a[0]); i++) {
printf("%d\n",a[i]);
}
return 0;
}
上述demo代码中:
sizeof(a)表示数组a在内存中占用大小sizeof(a[0])表示数组a的首元素在内存中占用大小[即每个元素在内存中占用大小]sizeof(a)/sizeof(a[0])表示数组元素的个数
0x03 数组应用¶
冒泡排序¶
算法思路
- 第一次遍历整个数组n个元素,通过相邻值比较将最大值放到最右边
- 第二次遍历剩下的n-1个元素,通过相邻值比较将最大值放到最右边
- 依次循环遍历,直到遍历最后1个元素
代码实现如下:
#include <stdio.h>
int main(){
int i, j;
int a[] = {34,5,124,624,3,65,};
int count = sizeof(a)/sizeof(a[0]);
for(i = 0;i < count;i++){
for(j = 1;j < count-i;j++){
if(a[j] > a[j-1]){
int tmp = a[j-1];
a[j-1] =a[j];
a[j] = tmp;
}
}
}
for(i=0; i < count; i++) {
printf("%d\n",a[i]);
}
return 0;
}