1、前言
C语言中的数据类型包括基本数据类型和复合数据类型。前面介绍的整形、浮点型、字符型都是基本数据类型,而数组属于复合数据类型。
基本数据类型是编程中最基础的数据类型,用于存储简单的数据值。复合数据类型则是由基本数据类型组合而成的数据类型,用于存储更复杂的数据结构。
2、数组的定义
(1)数组就是相同数据类型的多个数据放在一起。
(2)在C语言中要定义一个数组,需要指定元素的类型和元素的数量,如下所示:
// 数据类型 数组名[元素个数];
// type arrayName [ arraySize ];
int a[10];
(3)注意点:
- 数据类型可以是任意有效的C数据类型。
- 数组中的所有元素必须是同一种数据类型。
- 元素个数不能为0,必须大于0的整数常量。
3、数组的初始化
3.1、定义时初始化 & 每一个元素单独初始化
(1)定义时初始化
int a[4] = {0, 5, 2, ,3};
大括号 { } 之间的值的数目不能大于我们在数组定义时在方括号 [ ] 中指定的元素数目。如果你省略掉了数组的大小,数组的大小则为初始化时元素的个数。因此,如果:
int a[] = {0, 5, 2, ,3};
您将创建一个数组,它与前一个实例中所创建的数组是完全相同的,元素个数为4个。
(2)每一个元素单独初始化
int a[4];
a[0] = 0;
a[1] = 5;
a[2] = 2;
a[3] = 3;
3.2、完全初始化 & 不完全初始化
(1)完全初始化
int a[4] = {33, 24, 34, 23};
/* 定义数组同时初始化,则可以省略数组定义时[]中的元素个数。
* C语言编译器会自动计算其元素个数,计算依据是初始化式中初始化元素的个数。
* 由此可知,省略[]中数组元素个数只有一种情况,那就是后面的初始化式必须为完全初始化。
*/
int b[] = {0, 1, 2, 3, 4}; // 数组的元素个数为5
(2)不完全初始化
- 不完全初始化式中的值从a[0]开始,依次向后赋值,不足的默认用0填充赋值。
- 局部变量的数组,不初始化时,每一个元素的值是随机的。
int a[4] = {23, 34, 24}; // 不完全初始化
int a[4] = {23, 34}; // 不完全初始化
int a[4] = {23}; // 不完全初始化
int a[4] = {}; // 不完全初始化
int a[4]; // 不初始化
4、数组的访问
(1)数组定时的时候作为整体定义,但是在使用时不能不作为整体使用,需要拆开使用数组中的各个元素。
(2)譬如定义数组 int a [4]; ,使用其中的四个元素,分别是a[0]、a[1]、a[2]、a[3],其中[]是数组的标志,[]中的数字叫做数组下标(index,索引),下标是我们访问数组中各个元素的指引。
(3)数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。
5、不同数据类型数组
(1)不同数据类型的一组数组合成不同类型的数组,如下所示:
int a[5]; // 整形数组
float a[5]; // 浮点型数组
double a[5]; // 双精度浮点型数组
char a[5]; // 字符数组
(2)C语言程序中,变量的实质就是内存中的一个格子。当我们定义(创造一个变量)了一个变量后,就相当于在内存中得到了一个格子,这个格子的名字就是变量名,以后访问这个内存格子就使用该变量名就行了。这就是变量的本质。
(3)数据类型的实质是内存中格子的不同种类,譬如在32位机器上:
数据类型 | 占用内存空间 |
---|---|
短整形格子(short) | 2字节空间 16位 |
整形格子(int) | 4字节空间 32位 |
单精度浮点型格子(float) | 4字节空间 32位 |
双精度浮点型格子(double) | 8字节空间 64位 |
字符型格子(char) | 1字节空间 8位 |
6、获取数组长度
6.1、sizeof运算符
(1)计算数据类型的大小:占多少字节
printf("%d\r\n", sizeof(short));
printf("%d\r\n", sizeof(int));
printf("%d\r\n", sizeof(float));
(2)计算变量的大小:占多少字节
int a = 0;
prinf("d\r\n", sizeof(a));
char b = 0;
prinf("d\r\n", sizeof(b));
float c[4] = {};
printf("d\r\n", sizeof(c)); // 计算数组c大小,单位字节
6.2、计算数组长度:数组的元素个数
(1)数组长度可以使用 sizeof 运算符来获取数组的长度,例如:
int numbers[] = {1, 2, 3, 4, 5};
int length = sizeof(numbers) / sizeof(numbers[0]);
(2)举例
#include <stdio.h>
int main() {
int array[] = {1, 2, 3, 4, 5};
int length = sizeof(array) / sizeof(array[0]);
printf("length = %d\n", length);
return 0;
}
(3)使用宏定义
#include <stdio.h>
#define LENGTH(array) (sizeof(array) / sizeof(array[0]))
int main()
{
int array[] = {1, 2, 3, 4, 5};
int length = LENGTH(array);
printf("length = %d\n", length);
return 0;
}
7、字符数组
7.1、字符数组的定义
(1)字符数组和其他数组定义上并无本质区别。
(2)字符数组中的元素可以理解为0~255的整数或者字符。
(3)字符与整数之间采用ASCII编码。
(4)char类型做整形时,范围是 -127~128;做字符时范围是 0~127。
char a[10];
7.2、字符数组的初始化
(1)赋值为字符
- 在C语言中引用单个字符时,应该用单引号' ',例如'a'
- 在C语言中引用字符串时,应该用" ",例如"abcde"
- "abcde"实际上有6个字符,分别是'a' 'b' 'c' 'd' 'e' '\0'
- '\0'是C语言中定义的字符串的结尾标志。所以,当c语言程序中使用"abcde"这种方式去初始化时,编译器会自动在字符'e'后面添加一个'\0'。
- '\0' 这个字符是ASCII码表中的第一个字符,是不可见字符,也就是在屏幕上不可显示,程序中使用转义字符来表示,即'\0';它的编码值是0。
char a[5] = {'a', 'b', 'c', 'd', 'e'};
// 数组的元素个数为5,字符串结尾的'\0'存储不到数组中,但也不会发生数组越界,不会报错
char b[5] = "abcde";
// 数组的元素个数为6
char c[] = "abcde";
// 定义时数组会越界,报错
//char a[5] = "abcdef";
(2)赋值为整数
char a[4] = {48, 49, 50, 51};