C语言相关知识-数组

1.什么是数组

数组是相同类型,有序数据的集合

2.数组特征

- 数组中的数据被称为数组的元素,是同构的
- 数组中的元素存放在内存空间里,(int[6]:申请在内存中开辟6块连续的基于int类型的变量空间)

衍生概念:下标(索引)

- 下标或索引代表了数组中元素距离第一给元素的偏移位置。
- 数组元素的地址值,下标越大,地址值越大 (每一块内存空间都有一个独有的内存空间)。
- 数组的下标是从0开始的。

3.一维数组

数组的定义

说明:

- 数组的类型说明符有数组中的元素来决定,也就是元素是什么类型,数组就是什么类型
- 数组名也是标识符,我们所说的数组(名),大家可以理解为数据类型是数组的变量(名)
- 数组容量也可以叫做常量表达式,举例:int  a[10],  int b[123*456]

类型:代表了数组中的元素类型

容量:数组中能存储多少个元素,数组容量可以是一个常量,常量表达式,还可以是符号常量,但必须是整型。

深入理解:

- 定义一个数组,相当于申请了一个可以容纳所制定元素数量的内存单元,所申请的内存单元是连续的。
- 定义一个数组,相当于定义了多个匿名变量,这些变量可以由数组名【下标】来标识。

4.数组元素的访问

原则:数组中的元素不能一次性访问所有元素,只能一个一个访问。

5.数组的初始化

定义数组的同时,用指定的数据来给对应元素赋值。

简化数组定义,需要对元素一一赋值操作。

语法规则:

类型 数组名[容量] = {常量1,常量2,常量3,....};

注意事将自动的初始化项:

数组可以部分初始化:也就是可以给数组中前几个元素初始化,未被初始化的元素将自动初始化,如0;如果定义数组时为指定数据容量,则系统会根据初始化元素累就定数组容量。
1.如果只给数组前几个初始化,后续剩余元素会自动完成初始化,比如赋值0
int arr[5] = {1,2,3};
int arr[5] = {1,2,3,0,0};
//2.如果定义数组时为指定数据容量,根据初始化元素累就定数组容量。
int arr[] = {1,2,3};
int arr[5] = {1,2,3,4,5};

衍生概念:

- 柔性数组:柔性数组的概念是在C99标准,针对结构体的最后一个成员可以是一个未指定大小的数组;

  广义简单理解:数组容量待定或者待确定的数组

面试题:

- 在不知道数组类型的情况下,如何确定数组元素的个数
  int length = sizeof(arr) / sizeof(arr[0])
  说明:

    1. arr就是我们计算的数组本身, sizeof(arr) 用来计算该数组中总的字节大小。

    2. sizeof(arr[0]) 用来计算数组中一个元素所占的字节大小,因为数组中的元素类型相同,所以计算哪一个都行。

    3. sizeof(arr)/sizeof(arr[0]) 就是用数组中总的字节数除以每一个元素所占的字节数,从而得到元素的个数。

补充:

​    在C中,`int`数组、`char`数组、`float`数组和`double`数组的主要区别在于它们存储的数据类型不同。每种数组都用于存储对应类型的元素集合,且每种类型的数据占用不同的内存大小(比如,在大多数现代架构中,`int`通常是4字节,`char`是1字节,`float`和`double`分别是4字节和8字节)。

`int`数组:补初始值0

`char`数组:补初始值\0

`float`数组:补初始值0.0

`double`数组:补初始值0.0

6.数组的典型应用:冒泡排序

1.冒泡排序

- 向后冒泡
  思想:

  1. 一次只排好,针对n个数,最差情况需要n-1次就可以排好
  2. 每次排序将相邻数据两两比较,将较大或较小的数据向后交换,等所有数据都比较完成,将较大或较小的数就会出现在最后,这也是该数应该有的位置。
  3. 在余下的数中,再次应用第二步的操作,知道只剩下一个数。

- 向前冒泡

  思想:

  1. 一次只排好,针对n个数,最差情况需要n-1次就可以排好
  2. 每次排序假定第一个元素是最大/最小的,用第一个元素的后一个元素一一与第一个元素比较,遇到较大/较小的和第一个元素交换,访问完整数组的最后一个元素,就排好了一个数
  3. 在余下的数中,再次应用第二步的操作,知道只剩下一个数。

7.二维数组

1. 定义

二维数组本质上是一个行列式的组合,也就是说二维数组是有行和列两部分构成。二维数组数据是通过行列进行解读。二维数组可被视为一个特殊的一维数组,相当于二维数组又是一个一维数组,只不过它的元素是一维数组。

语法:
类型 数组名[行数][列数];

特殊写法

下标可以是整型表达式,如: a[2-1][2*2-1]

下标可以是已经有值的变量或数组元素, 如 a[2*x-1][b[3][1]]

数组元素可以出现在表达式中, 如: b[1][2]=a[2][3]/2

2.初始化

分行给二维数组赋初值

可将所有数据写在一个花括号内,按照排列顺序对元素赋值。

可对部分元素赋初值,其余未赋值部分自动填充 0 | \0 | 0.0...

若对全部元素赋初值,自定义数组时可以省略第1为数组的长度,第2维数组的长度必须指明。

在分行赋初值是,也可以省略第1维的长度。

8.字符数组

1.概念

元素类型为char字符型的数组,字符数组往往是用来存储字符串数据的。需要注意的一点是,我们C语

言中的字符是字节字符。字节字符:也就是一个字符占1个字节

语法:

字符数组的语法就是之前所学一维数组和二维数组的语法,只不过数据类型是char而已。

注意:

如果我们的char数组初始化的时候,没有完全赋完值的时候,空出来的地方使用 \0 进行填充。

2.字符数组的多样表示

我们的char数组可以以数组的方式一个个输出每个字符;我们的char数组也可以以字符串的方式整体进行输出所有字符。

注意

字符串的长度与字符数组的长度不一定相同。

利用字符串常量可以对字符数组进行初始化,但不能用字符串常量为字符数组赋值。

字符串的基础操作

3.字符串输入

scanf("%s",数组名)

注意:采用scanf进行字符串输入,要求字符串中不能存在空格,否则字符串遇到空格会结束。

fgets(数组名,数组容量,stdin);

说明:采用fgets进行字符串输入,可获取所有输入的字符串,包含 \n ,在实际的字符串处理时,我们可能需要处理 \n

注意:

1. 如果输入的字符串不包含 空格 和 换行 ,可以使用scanf() | fgets();

2. 如果输入的字符串需要包含 空格 和 换行 ,只能使用fgets();

3. 经过对比,我们发现,在字符串的输入中,fgets()更好;

4.字符串输出

puts(数组名)

printf("%s",数组名);

5.字符串拼接

strcat(数组名,"需要拼接的字符串")

注意:需要引入 #include <string.h>

6.字符串拷贝

strcpy(数组名,字符串)

注意:需要引入 <string.h>库

说明:这个方法适合给字符串赋值用。

7.字符串比较

strcmp(字符串1,字符串2);

注意:

1. 需要引入 <string.h>
2. 返回的结果是boolean

8.获取字符串长度

strlen(字符串)

注意:

1. 需要 <string.h>
2. 返回字符串长度

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值