1. 一维数组的创建和初始化
数组是一组相同类型元素的集合。
变长数组是不能初始化的。
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。
例如上图
char ch3[ ]="abc";里面方的就是 a b c \0
char ch3[ ]="abc";里面方的就是 a b c \0
对于数组的使用我们之前介绍了一个操作符:[ ],下标引用操作符。它其实就数组访问的操作符。
总结:
- 数组是使用下标来访问的,下标是从0开始。
- 数组的大小可以通过计算得到
一维数组在内存中的存储
地址和地址之间差四个字节,因为一个整形占4个字节。
随着数组下标的增长,元素的地址,也在有规律的递增。
由此可以得出结论:数组在内存中是连续存放的。
2. 二维数组的创建和初始化
二维数组可以省略行,不能省略列。
二维数组在内存中也是连续存储的。
3. 数组越界
数组的下标是有范围限制的。
数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。
所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的, 所以程序员写代码时,最好自己做越界的检查。
越界之后打印的是随机数。
4. 数组作为函数参数
往往我们在写代码的时候,会将数组作为参数传个函数,比如:我要实现一个冒泡排序(这里要讲算法 思想)函数。将一个整形数组排序。
冒泡排序的核心思想:两个相邻的元素进行比较。
一趟冒泡排序让一个数据来到它最终应该出现的位置上!
10个元素需要9次。
n个元素需要n-1次冒泡排序。
数组名本质上是:数组首元素的地址
//数组传参的时候,形参有2种写法:
//1.数组
//2.指针//形参是数组的形式
void bubble_sort(int arr[],int sz)
{int i = 0;for ( i = 0; i < sz-1; i++){//一次冒泡排序int j = 0;for ( j = 0; j < sz-1-i; j++){if (arr[j] > arr[j + 1]){//交换int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}}int main()
{//把数组的数据排列成升序int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//降序int sz = sizeof(arr) / sizeof(arr[0]);//冒泡排序的算法,对数组进行排序bubble_sort(arr,sz);int i = 0;for ( i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}
//形参是指针的形式
void bubble_sort(int* arr,int sz)
{int i = 0;for ( i = 0; i < sz-1; i++){//一次冒泡排序int j = 0;for ( j = 0; j < sz-1-i; j++){if (arr[j] > arr[j + 1]){//交换int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}}int main()
{//把数组的数据排列成升序int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//降序int sz = sizeof(arr) / sizeof(arr[0]);//冒泡排序的算法,对数组进行排序bubble_sort(arr,sz);int i = 0;for ( i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}
5.数组名是什么?
数组名确实能表示首元素的地址。
但是又两个例外:
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
二维数组的数组名也表示首元素的地址。
表示的这一行的地址
中间隔了十六个字节,也就是四个数值。
行列计算