1.一维数组的创建和初始化
一维数组在内存中是连续存放的
数组的创建:数组是一组相同类型元素的集合。数组的创建方式:
type_t arr_name [const_n];
type_t 是指数组的元素类型
const_n 是一个常量表达式,用来指 定数组的大小、
数组的初始化: int arr1[10]={1,2,3}; 不完全初始化,剩下的默认为0
char arr2[10]={"abc"};存储的时候是,a,b,c,\0,剩下的默认为0
char arr3[10]={'a','b','c'};存储的时候,是'a','b','c',剩下的为0
sizeof和strlen 的区别:
sizeof是计算变量,数组,类型所占空间的大小,单位是字节,也包括\0——它是一个操作符
strlen 是只能字符串求长度—‘\0’之前的字符个数,不包括‘\0’。——它是库函数,得引头文件
2.二维数组
二维数组在内存中的存储是连续的
二维数组的初始化:
int arr[3][4]={1,2,3,4,5};//创建的数组是3行4列,这样初始化的话,第一行是1,2,3,4第二行是5,0,0,0,第三行是0,0,0,0。
int arr[3][4]={{1,2,3},{4,5}};//创建的数组是3行4列,这样初始化的话,第一行是1,2,3,0第二行是4,5,0,0,第三行是0,0,0,0
二维数组初始化的时候可以省略行但是不能省略列
如:正确的初始化方式:int arr[][4]={{1,2,3},{4,5}}
错误的初始化方式:int arr[][]={{1,2,3},{4,5}};
行与列的下标都是从0开始的
3.数组的应用——冒泡排序
冒泡排序就是把一行乱序的数字,把第一个数字与其他数字两两比较,知道与最后一个比较结束。然后再用第二个数字依次和除第一个数字以外的数字相比较大小排序。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void bubble_line(int arr[],int sz)
{
int i = 0;
for (i = 1; i < sz; i++)
{
int flag = 1;//此处设置一个标志,当一个数组中的顺序本来就是顺序,或者在中途已经拍好顺序的时候,后续的比较就不必进行
int j = 0;
for (j = 0; j < sz - i; j++)
{
int temp = 0;
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = 0;
}
}
if (flag ==1)
{
break;
}
}
}
int main()
{
int arr[] = { 9,1,2,8,4,5,6,7,3,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
bubble_line(arr,sz);
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
4.数组名就是首元素的地址
int main()
{
int arr[]={0,1,2,3,4,5,6,7};
printf("%p\n",arr);
printf("%p\n",&arr[0]);
printf("%p\n",&arr);
return 0;
}
最后得出的结果是一样的,但是前两个取出的是数组中首位元素的地址,第三个表示的是取出的是整个数组的地址的首地址,是一个范围的起始地址。
结论:数组名是数组首元素的地址(有两个例外)
1.sizeof(数组名),计算整个数组的大小,单位是字节,sizeof内部单独放一个数组名,数组名表示整个数组。
2.&数组名,取出的是数组的地址。&数组名,取出的是整个数组的地址。