04.【C语言学习笔记】数组
目录
1. 数组元素的类型 和 数组类型
1.1 数组元素的类型(常见类型)
1.2 数组的类型
2. 数组的初始化
3. 下标引用操作符 [ ]
4. 一维数组在内存中的存储
5. 计算数组元素个数 sizeof
6. 二维数组的初始化
6.1 不完全初始化
6.2 完全初始化
6.3 按照行初始化
6.4 初始化时省略行,但是不能省略列
7. 二维数组在内存中的存储(同一维数组)
8. 变长数组(C99)
9. Windows中的延时函数、清空cmd窗口的命令
10. 二分查找代码实现
1. 数组元素的类型 和 数组类型
1.1 数组元素的类型(常见类型)
type arr_name[常量值];
type 指定的是数组中存放数据(元素)的类型,可以是: char、short、int、float 等,也可以自定义的类型
1.2 数组的类型
数组算是一种自定义类型,去掉数组名留下的就是数组的类型。
int arr1[10];
int arr2[12];
char ch[5];
arr1 数组的类型是int [10]
arr2 数组的类型是int[12]
ch 数组的类型是char [5]
2. 数组的初始化
不完全初始化,剩下的元素默认初始化为0。
如果数组初始化,[ ] 中可以不写元素个数
//完全初始化
int arr[5] = {1,2,3,4,5};
//不完全初始化
int arr2[6] = {1};//第一个元素初始化为1,剩余的元素默认初始化为0
//错误的初始化 - 初始化项太多
int arr3[3] = {1, 2, 3, 4};
char arr4[5] = {0};
3. 下标引用操作符 [ ]
操作符[ ] ,这个操作符叫:下标引用操作符。
4. 一维数组在内存中的存储
从输出的结果我们分析,数组随着下标的增长,地址是由小到大变化的,并且我们发现每两个相邻的元素之间相差4(因为一个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的。随着下标的增长,地址是由小(低)到大(高)变化的这就为后期我们使用指针访问数组奠定了基础。
5. 计算数组元素个数 sizeof
以下获取数组元素个数代码
#include <stdio.h>
int main()
{int arr[10] = { 0 };int sz = sizeof(arr) / sizeof(arr[0]); // 获取数组元素个数printf("%d\n", sz); return 0;
}
6. 二维数组的初始化
6.1 不完全初始化
int arr1[3][5] = { 1,2 };
int arr2[3][5] = { 0 };
6.2 完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 1 3,4,5,6,7};
6.3 按照行初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};
6.4 初始化时省略行,但是不能省略列
int arr5[][5] = {1,2,3}; // 1行
int arr6[][5] = {1,2,3,4,5,6,7}; // 2行
int arr7[][5] = {{1,2}, {3,4}, {5,6}}; // 3行
7. 二维数组在内存中的存储(同一维数组)
每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以二维数组中的每个元素都是连续存放的。
8. 变长数组(C99)
C99中给一个变长数组(variable-length array,简称 VLA)的新特性,允许我们可以使用变量指定数组大小。请看下面的代码:
int n = a+b;
int arr[n];
上面示例中,数组arr 就是变长数组,因为它的长度取决于变量n 的值,编译器没法事先确定,只有运行时才能知道n 是多少。
变长数组的根本特征,就是数组长度只有运行时才能确定,所以变长数组不能初始化。它的好处是程序员不必在开发时,随意为数组指定一个估计的长度,程序可以在运行时为数组分配精确的长度。有一个比较迷惑的点,变长数组的意思是数组的大小是可以使用变量来指定的,在程序运行的时候,根据变量的大小来指定数组的元素个数,而不是说数组的大小是可变的。数组的大小一旦确定就不能再变化了。
9. Windows中的延时函数、清空cmd窗口的命令
要包含 Windows.h 头文件
使用方法如下:
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <string.h>
#include <Windows.h>
int main()
{char arr1[] = "welcome come to bit!!!";char arr2[] = "**********************";int n = strlen(arr1);for (int l = 0, r = n - 1; l <= r; ++l, --r){arr2[l] = arr1[l];arr2[r] = arr1[r];printf("%s\n", arr2);Sleep(1000); // windows的延时函数,要包含 Windows.h 头文件system("cls"); // windows的清空cmd窗口的命令,system函数,传"cls"字符串参数}return 0;
}
10. 二分查找代码实现
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int n = sizeof(arr) / sizeof(arr[0]);int key = 0;while(scanf("%d", &key) != EOF){int l = 0;int r = n - 1;int mid = (l + r) / 2;int flag = 0;while (l <= r){mid = (l + r) / 2;if (key > arr[mid])l = mid + 1;else if (key < arr[mid])r = mid - 1;else{flag = 1;printf("找到了!下标是%d\n", mid);break;}}if (flag == 0)printf("没找到\n");}return 0;
}