C语言【数组】

C语言【数组】

一、数组的一些零碎的知识

1、数组在内存中的空间是连续的,数组下标从0开始;
数组中存储的类型是一致的(只能存储同一类型,这样可以快速定位某元素)
2、指针可看作存储地址的变量,数组名可看作地址那个常量,所以数组名不可修改 。可以改的是数组元素:a[0] 或 *a

二、一维数组

1、整型数组的定义

​ 第一种。声明后定义。

int arr1[3];	// 局部中默认值为随机值,全局 或 静态局部 中为0或""

​ 第二种。声明的同时赋初始。这种情况赋值个数--少补0,多报错

int arr2[3] = {4, 5, 6};

​ 第三种。不指定元素个数,直接初始化。

int arr3[] = {4, 5, 6};
2、数组越界问题

​ C语言的数组越界是个特性。编译和运行时都不会报错

​ 一般情况,在栈种分配的变量内存,之前的变量在高地址,所以数组越界(索引-1时)可能会修改或读取到之前的数据。不建议故意越界。

3、数组长度

​ sizeof计算的是字节数,所以一维数组的数组长度计算如下:

sizeof(arr) / sizeof(arr[0]);
4、字符型数组的定义

​ 第一种。单个字符地赋值,需要手动加 '\0',不加'\0'的话会往下一直找,直到碰到有'\0'的地方,这样后面的值会很随机。

char str1[3] = {'h', 'e', 'l'};	// 长度3,不自动补'\0'

​ 第二种。声明并赋值时少赋值,利用 补0 的特性,让它添加上0。略。

​ 第三种。

char str3[] = {'a', 'b'}; 	// 长度2,不会自动补'\0'

​ 第四种。

char str4[] = {"abc"}; 	// 长度4,自动补'\0'
char str4_1[] = "abc";	// 长度4,自动补'\0' 

​ 第五种。注意这个是上面的指定了长度。一般没这样写的,千万不要误导,这个不自动补'\0'。

char str5[3] = "hel";	// 长度3,不自动补'\0'

​ 声明后赋值。

char strx[6];
strx[] = "abcde";

三、二维数组

1、多维数组在内存中不是以矩阵形式存储,而是 第一行存储完后 第二行接着往下来 这样存储的。
2、对于int a [2] [3]; 这个数组来说,a [0] [3] 与 a [1] [0] 表示的是同一个元素。理解吧。
3、二维数组的声明并初始化

​ 第一种。

int a[2][3] = {
    {1, 2, 3},
    {1, 2, 3}
};

​ 第二种。

int a[2][3] = {1, 2, 3, 4, 5, 6};

​ 第三种。省略有几行,即省略第一个[]里的长度指定。

int a[][3] = {1, 2, 3, 4, 5, 6};
int a[][3]; // 这样肯定不行,既然省略了行,就不能省略总个数。
4、二维数组中长度的计算。
sizeof(arr)/sizeof(arr[0]);  	// 得到有几行
sizeof(arr[0])/sizeof(arr[0][0]);	// 得到每列的个数
sizeof(arr)/sizeof(arr[0][0]);		// 得到数组总长度(个数),知道这个可以用一个for循环遍历数组  a[0][0] -- a[0][个数-1]
// 解释一下
sizeof(arr); 	// 得到列表 总字节数
sizeof(arr[0][0]);	// 得到每个元素的字节数,即类型的字节数

C语言没有动态声明变量的方法。

C语言最早不支持 a[变量名] 。数组下标只能是字面常量或#define定义的字面常量;const定义的也不行。

后期能够使用 a[变量名] 。 这种形式不能声明的同时赋初值,只能声明完成后再赋值。而且,变量修改后,数组长度不跟随变量修改。

补两个无关的:

1、使用win终端命令chcp可查看此处使用编码的代号,chcp 代号,可改变编码的代号,比如把gbk改为utf8,使得vscode和win终端编码统一。

2、关于底层存储和printf输出。如果数位溢出,是在存储层面超过了定义的数据类型,如果输出时使用的占位符超出溢出的范围,也可以正确显示;同理,占位符选用过小,即使没溢出,也会输出不正确的结果。

posted on 2023-11-19 22:08  持枢丶  阅读(101)  评论(0编辑  收藏  举报