数组
数组的创建
数组是一组相同类型元素的集合
type_t arr_name [const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int arr2[100] = {0};
}
C99变长数组(创建数组时)
int n = 10;
int arr[n];// C99允许数组的大小用变量来指定,如果编译器不支持C99中的变长数组,那就不能使用。
//vs2019不支持变长数组
变长数组不可初始化
数组的初始化
在创建数组的同时给数组的内容一些合理初始值(初始化)。
数组在创建的时候如果想不指定数组大小就得初始化。数组的元素个数根据初始化的内容来确定。
不初始化就是随机值。
栈上创建的变量,如果不初始化,是随机值。
静态区不初始化值为0。
int arr1[10] = {1,2,3};//不完全初始化,后面是0
//以下两种形式都一样
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
区分:
//字符数组未初始化就是\0
char arr1[] = "abc";// a b c \0
char arr2[3] = {'a','b','c'}; // a b c
访问数组
[],下标引用操作符
arr[4]// arr,4是[]的两个操作数
int arr[100] = {0};
int sz = sizeof(arr)/sizeof(arr[0]);
//400 4
//循环初始化
int i = 0;
for(i = 0;i < sz;i++)
{
arr[i] = i + 1;
}
一维数组在内存中的存储
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
for(i=0;i<sz;i++)
{
printf("&arr[%d] = %p",i,&arr[i]);
}
return 0;
二维数组的创建和初始化
二维数组的创建
int arr[3][5];
chra ch[5][7];
二维数组的初始化
int a
二维数组的使用
也一样,下标访问即可
利用行列锁定元素
int arr2[][5] = {{1,2},{4,5},{5,6}};//行能省略,但是列不可省略
int i = 0;
//3可以用**sizeof(arr2)/sizeof(arr2[0])**;代替 整个除第一行大小s
for(i=0;i<3;i++)//0 1 2
{
int j = 0;
//5可以用**sizeof(arr2[0])/sizeof(arr2[0][0])**;代替 第一行除第一行第一列的元素
for(j = 0;j <5; j++)//0 1 2 3 4
{
printf("%d ",arr2[i][j]);//打印的是一行
}
printf("\n");
}
实际 二维数组在内存中也是连续存放的。
列能知道一行有几个元素,能怎么放元素
可以把二维数组看作一维数组的组合,按照行区分
数组越界
数组的下标是有范围限制的。
数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。
所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的
所以程序员写代码时,最好自己做越界的检查。
二维数组的行和列也可能存在越界。
数组作为函数参数
冒泡排序
数组中两个相邻的元素进行比较,如果不满足顺序就交换。
10个数要跑9趟
n个数要跑n-1趟
每一趟里面也在递减元素个数
没排序
- sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数
组。 - &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。
除以上两种情况,数组名是数组首元素地址.
&数组名 直接跨一个数组
数组传参,写成数组更加容易理解,虽然本质是指针
void Bubble_sort(int arr[],int sz)
{
int i = 0;
int flag = 1;
for (i = 0; i < sz - 1; ++i)//走多少趟
{
//每一趟冒泡排序的过程
int j = 0;
for (j = 0; j < sz-i-1; ++j)//10 跑9 9跑8
{
flag = 0;
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
if (1 == flag)
{
break;
}
}
}