一、什么是数组
C 语言支持数组数据结构,数组存储一个固定大小的相同类型元素的顺序集合。
一个数组变量,比如student,然后使用 student[0]、student[1]、...、student[100] 来代表一个个单独的变量。不需要声明一个个单独的变量,比如 student0、student1、...、student100
所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。(即数组名就是数组首地址)
二、数组的初始化
1.完全初始化:
int arr[5] = {1, 2, 3, 4, 5};
2.部分初始化
int arr[5] = {1, 2, 3};
依次赋值,没有被赋值到的元素自动补0;
eg:
int arr[5] = {0}; //全0
3.不给维数(下标)的初始化
int arr[] = {1, 2, 3, 4, 5};
//表示arr是一个可以存储5个整型元素的数组
//数组的大小根据赋值的元素个数来确定的
//sizeof(arr) == 20 (5个int类型)
三、数组的大小
数组的大小: sizeof(数组名);
单个元素所占字节数: sizeof(arr[0]) == sizeof(数据类型)
数组的大小 = 单个元素所占字节数 * 元素个数;
元素个数 = 数组所占字节数 / 单个元素所占字节数
四、字符一维数组及字符串
- 字符串由多个字符组成,结尾自带 '\0'
一般形式: 存储类型 char 数组名[常量表达式]; eg: char buf[32]: 表示一个可以存储32个字符的数组; //-------------------------------------------- 字符数组的初始化: 一、逐个字符赋值: 1)完全初始化: char buf[6] = {'h', 'e', 'l', 'l', 'o', '\0'}; //一般都会将字符数组当成字符串来处理, //当成字符串处理的时候就一定要保证有'\0'结尾; 补充: %s 输出遇 '\0'结束 %s 输入 遇到空格或者回车结束 2) 部分初始化 char buf[6] = {'h', 'o', 'w'}; 会逐个赋值,没有被赋值到的元素补上'\0'; 3) 不给下标的初始化 char buf[] = {'h', 'e', 'l', 'l', 'o', '\0'}; //数组占6字节 二、字符串直接赋值 char buf[6] = {"hello"}; char buf[6] = "hello"; char buf[] = "hello"; ---> 由 'h' 'e' 'l' 'l' 'o' '\0' 共6个元素组成
五、进阶_二维数组
一般形式:
<存储类型> <数据类型><数组名>[常量表达式1][常量表达式2];
行 列
存储:
内存是一维的,二维数组的存储按行序优先
eg:
int a[2][3]
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
一维数组:
arr[5] --> arr arr + 1
首地址 第二个元素的地址
二维数组的理解:
二维数组可以看成由多个一维数组组成
int a[2][3]
由两个元素组成 a[0] 和 a[1] 组成
a[2][3] --> {a[0], a[1]}
a[0] 相当于第一个一维数组的数组名;
a[0][0] a[0][1] a[0][2]
a[1] 相当于第二个一维数组的数组名
a[1][0] a[1][1] a[1][2]
二维数组的大小
二维数组的大小 = 单行所占字节数 * 行数
sizeof(a) == sizeof(a[0]) * 行数
单行所占字节数 == 单个元素所占字节数 * 列数
sizeof(a[0]) == sizeof(a[0][0]) * 列数
二维数组的引用
二维数组名[下标][下标];
行 列
逐个访问;
eg:
按行序给二维数组赋值;
int a[3][2];
a[0][0] = 1; //第一行 a[0]
a[0][1] = 2;
a[1][0] = 3; //第二行 a[1]
a[1][1] = 4;
a[2][0] = 5; // 第三行 a[2]
a[2][1] = 6;
初始化
1.按元素排列顺序初始化
int arr[2][3] = {1, 2, 3, 4, 5, 6}; //完全初始化
int arr[2][3] = {1, 2}; //部分初始化
int arr[2][3] = {0}; //部分初始化
int arr[][3] = {1, 2, 3, 4}; //不给维数的初始化
/*这个数组至少需要两行才能存下,这个数组最多只能存两行,
数组大小为 24字节 --> 6个元素*/
2.按分行初始化
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; //完全初始化
int arr[2][3] = {{1}};//部分初始化
int arr[2][3] = {{1}, {2, 3}};//部分初始化
int arr[][3] = {{0}, {0}}; //给了几行就最多能存几行
int arr[][3] = {{1, 2, 3}, {4, 5, 6}};
//给了几个分行就最多能存几行
注意:在省略维数的时候,只能省略行的下标
转义字符
"\x69\076";
这个字符串由 '\x69' 和字符 '\076' '\0' 三个字符组成;
一个字符 ascii 的八进制和十六进制可以用转义字符表示;
char ch = 'A';
printf("ch = %c\n", ch);
ch = 65;
printf("ch = %c\n", ch);
ch = '\101'; // ch = 0101;
printf("ch = %c\n", ch);
ch = '\x41'; // ch = 0x41;
printf("ch = %c\n", ch);