【C语言/C++】 数组

1、引言

学习从来都不是一件简单的事情,人们总是倾向于待在自己的舒适圈中,而学习就是让人们从自己的舒适圈之中走出来,去拥抱更广阔的,未知的世界,所以人们会本能的抗拒学习,但是,只有不断去突破自己的舒适圈,我们才能变得更好,所以,不要害怕学习,或许这条道路会很艰辛,但是学成之后,我们会变得更好。

2、数组的创建和初始化

2.1、数组的创建

1、数组是一种相同类型元素的集合
2、数组的创建方式如下

type_t arr_name [const=n]
//type 是数组的元素类型
//const_n 是一个常量表达式,用来制定数组大小

3、变长数组(C99标准)
在C99标准下,支持变长数组这个概念,即可以再数组的[ ]中添加变量,但是创建的变长数组是不能够初始化的。在C99标准之前[ ]之中只能输入常量。

2.2、数组的初始化

1、创建一个数组的同时给一些初始值叫做初始化,其中初始化又分为完全初始化不完全初始化,一下为完全初始化的例子(完全初始化[ ]中给的数字是多少,后面的{ }中就填入多少个数字来初始化数组。)

int arr[10] = {1,2,3,4,5,6,7,8,9,10};

不完全初始化:即将数组中的所有元素都初始化成0.

int arr[10] = { 0 };

如果创建数组的时候不在[ ]填入创建数值元素的具体个数,那么该数组根据初始化的内容来创建数组中的元素,下面数组创建的元素只有1,2,3。

int arr[] = {1,2,3];

字符串是可以用来初始化字符数组的:

char arr1[]={'a','b','c'}
//arr1有3个元素,数组的大小是3个字节
//所以printf("%d",sizeof(arr1))打印出来的数字是3
char arr2[]="abc"
//arr2有4个元素,因为字符串中隐藏了一个'\0'来停止字符串,数组大小4个字节
//printf("%d",sizeof(arr2))打印出来的数字是4

总结:
1、数组是使用下标来访问的,下标是从0开始;
2、数组的大小是可以通过计算得到的;
计算方式

int arr[10];
int sz=sizeof(arr)/sizeof(arr[0]);

3、一维数组

1、一维数组在内存是连续存放的
2、一维数组随着下标的增长,地址是由低到高变化的,运用例子如下

int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int *p=&arr[0];
int i=0;
for(i=0;i<10;i++)
{
printf("%d ",*(p+i));
}
}

4、二维数组

4.1、二维数组的创建

int arr[3][4];
char arr[3][5];
double arr[2][4];

二维数组表示创建相同类型的元素,其中前面[ ]中的数字表示行数,后面[ ]中的数字表示列数,int arr[3][4]表示创建一个3行4列的整型数组。其中行和列的编号也是从0开始,第0行到第n行,第0列到第n列。

4.2、二维数组的初始化

1、二位数组初始化时,将方括号内的数字依次填入行中,填满一行就填入下一行。

int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

2、如果使用以下这种初始化方式

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

则是在第一行中填入1,2;第二行中填入3,4;第三行中填入5,6;

3、二维数组的第三种初始化方式

int arr[][4]={1,2,3,4,5,6,7,8,9,10,11,12};

使用这种初始化方式的时候,数组的行数可以省略,但是列数不能省略

4.3、二维数组在内存中的储存位置

1、二维数组在内存中依然是连续存放的
2、不同的数组类型所占内存大小不同,例如int类型数组,每个元素占四个字节大小,所以每个元素的地址之间相差4。char类型数组的每个元素占一个字节大小,所以每个元素的地址之间相差1。

5、数组越界

1、数组的下标是有范围限制的,数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。所以数组的下标如果小于0,或者大于n-1,那么这个数组的访问就越界了。但是值得注意的是,C语言本身是没有对数组越界进行定义的,所以有可能产生了数组越界的错误,编译器却没有报错,所以我们应该自己检查数组越界这个错误。

2、二维数组也会存在越界,二维数组的行数和列数下标规定也是从0开始的,到n-1个下标,倘若超出了这个范围,也是越界的。

5.1、多维数组

C语言中是支持多维数组的,例如三维数组,但是用的比较少,最高用到3维就差不多了吧,毕竟现实生活的4维、5维之类的更高维度人类目前也无法理解。

int arr[2][3][3];

6、数组传参

1、数组进行传参的时候直接输入数组名就可以了
2、数组传参实际上传递的是数组的首元素地址
3、在一般情况下,数组名是数组的首元素地址,但是在以下两种情况下,数组名不是代表首元素地址:
Ⅰ、sizeof内部单独放一个数组名,数组名表示整个数组,sizeof(数组名)是计算整个数组的大小,单位是字节;
Ⅱ、&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。

小知识

1、strlen是一个库函数

计算的是字符串的长度,并且只针对字符串
关注的是字符串中是否有’\0’,计算的是’\0’之前的字符的个数

2、sizeof是一个操作符(运算符)

sizeof是用来计算变量所占内存空间的大小,任何类型都是可以使用
只关注空间大小,不在乎内存中是否存在’\0’

3、冒泡排序

1、核心思想:两两相邻的元素进行比较,如果有可能的话,需要交换。
2、一趟冒泡排序能够让当前待排序的数组中的一个数字,来到它最终应该出现在的位置

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值