数组
数组是让你批量创建一组相同类型的变量。
1.初始化数组
使用数组前必须先初始化它,与普通变量类似,在使用数组元素之前,必须先给它们赋初值。编译器使用的值是内存相应位置上的现有值。
初始化列表中的项数应与数组的大小一致,当初始化列表中的值少于数组元素个数时,编译器会把剩余的元素都初始化为0.也就是说,如果不初始化数组,数组元素和未初始化的普通变量一样,其中储存的都是垃圾值;但是,如果部分初始化数组,剩余的元素就会初始化为0。
如果初始化列表的项数多于数组元素个数,编译器可没那么仁慈,它会毫不留情地将其视为错误。但是,没必要因此嘲笑编译器。其实,可以省略方括号中的数字,让编译器自动匹配数组大小和初始化列表中的项数。
创建数组时,方括号里的内容只能是常量,不能是变量。
在C89标准中,创建数组时,[ ]中写的数字,必须是“常量”。
在C99标准中,是允许[ ]使用变量的
int n = 10;
int arr[n];
C语言中常量的表示形式:
1、字面值 10
2、const修饰
3、 enum枚举
4、#define宏
初始化实例:
代码如下(示例):
int arr1[10] = {1,2,3};
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";
2.数组的使用
在使用数组时,要防止数组下标超出边界。
在C语言中,针对数组取下标操作,千万不能越界,一旦越界之后,产生的效果,称为“未定义行为”,运行结果不可预期(可能程序会读出一个错误的值,可能程序会读出一个看起来“正确”的值,也可能程序会直接崩溃,甚至可能系统直接死机…)具体是以哪种结果出现,取决于操作系统,也取决于编译器,也取决于运行环境…。
所以在写代码的时候必须要避免出现未定义行为,代码中的未定义行为一定是BUG。
数组下标越界,本质上是“访问了非法内存”,内存必须是你申请的才能用,不申请的不能随便用。
[ ]操作元素,有两个操作:
读:获取变量的值
写:修改变量的值
一维数组在内存中的存储:
结论,元素都是处在连续的内存空间上。
3.二维数组
数组的维数可以有很多。但是实际开发中很少使用高维数组。
二维数组的创建:
代码如下(示例):
//数组创建
int arr[3][4];
char arr[3][5];
double arr[2][4];
//数组初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}}
所谓的二维数组,本质上,也就是一个一维数组。只不过,每个数组元素有是一个一维数组,也习惯上叫做“3行4列”。
int arr[3][4];
这个数组是一个长度为3的一维数组,每个元素又是一个长度为4的一维数组
二维数组在访问下标的时候,需要两个下标,分别表示行的下标和列的下标。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int arr[3][4] =
{{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
for(int i = 0;i < 3;i++)
{
for(int j = 0;j < 4;j++)
{
printf("%d",arr[i][j]);
}
printf("\n");
}
system("pause");
return 0;
}
4.一个小应用(冒泡排序)
#include<stdio.h>
#include<stdlib.h>
void bubbleSort(int arr[], int size)
{
for (int bound = 0; bound < size; bound++)
{
for (int cur = size - 1; cur>bound; cur--)
{
if (arr[cur - 1] > arr[cur])
{
int tmp = arr[cur - 1];
arr[cur - 1] = arr[cur];
arr[cur] = tmp;
}
}
}
}
int main()
{
int arr[] = { 9, 5, 2, 7 };
//按照升序排序
bubbleSort(arr,sizeof(arr) / sizeof(arr[0]));
system("pause");
return 0;
}