【必会系列】数组

一维数组

 

一维数组定义一般形式:
dataType arrayName[index]
dataType 数据类型
arrayName 数组名称
index 下标

看起来很陌生是不是?举一个常见的例子你就眼熟了int arr[ 2 ]。

数组内存是连续的

数组是一个整体,它的内存是连续的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙。下图演示了int a[4];在内存中的存储情形:

「数组内存是连续的」这一点很重要。连续的内存为指针操作(通过指针来访问数组元素)和内存处理(整块内存的复制、写入等)提供了便利,这使得数组可以作为缓存(临时存储数据的一块内存)使用。

数组的完全初始化:

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

数组中的元素从角标0-4均匀分布,就像下面这个样子

数组的不完全初始化:

表示只给 arr[0]~arr[3] 4个元素赋值,而后面 6 个元素自动初始化为 0,看下图:

数组赋零初始化:

  • 对于short、int、long,就是整数 0;
  • 对于char,就是字符 '\0';
  • 对于float、double,就是小数 0.0。
int nums[10] = {0};
char str[10] = {0};
float scores[10] = {0.0};

 这里要注意的是:赋0可以这样初始化,二其他的数字是不可以这样一步赋0的,只能一个一个来赋值。

二维数组

二维数组定义一般形式:
dataType arrayName[ROW][COL];
dataType 数组类型
arrayName 数组名称
ROW 行
COL 列

Ⅰ、定义二维数组就跟我们定义矩阵是一样的,定义一个五行三列的数组int arr[5][3] = {0};

至于赋值的话,有两种方式:

分段赋值:int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };

连续赋值:int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};

这两种赋值的结果是一样的。

还有二维数组的赋值顺序是从上到下,从左到右,未赋值的部分全部写为0

例如:int a[3][3] = {{1}, {2}, {3}};
1  0  0
2  0  0
3  0  0

或者:int a[3][3] = {{0,1}, {0,0,2}, {3}};

0  1  0
0  0  2
3  0  0

再或者:int a[3][3] = {1,1,1,2};

1  1  1
2  0  0
0  0  0

Ⅱ、如果对全部元素赋值,那么第一维的长度可以不给出。例如:

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

可以写为:

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

Ⅲ、二维数组可以看作是由一维数组嵌套而成的;如果一个数组的每个元素又是一个数组,那么它就是二维数组。当然,前提是各个元素的类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组,C语言允许这种分解。

例如,二维数组a[3][4]可分解为三个一维数组,它们的数组名分别为 a[0]、a[1]、a[2]。

这三个一维数组可以直接拿来使用。这三个一维数组都有 4 个元素,比如,一维数组 a[0] 的元素为 a[0][0]、a[0][1]、a[0][2]、a[0][3]。

字符数组

字符数组啊,顾名思义就是装字符的数组。。。

char a[10];  //一维字符数组
char b[5][10];  //二维字符数组
char c[20]={'c', '  ', 'p', 'r', 'o', 'g', 'r', 'a','m'};  // 给部分数组元素赋值
char d[]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm' };  //对全体元素赋值时可以省去长度

字符数组实际上是一系列字符的集合,也就是字符串(String)。在C语言中,没有专门的字符串变量,没有string类型,通常就用一个字符数组来存放一个字符串。

char str[30] = {"Mr.Xiwen"};
char str[30] = "Mr.Xiwen";  //这种形式更加简洁,实际开发中常用
这里为了节省内存也可以这样写
char str[  ] = {"Mr.Xiwen"};
char str[  ] = "Mr.Xiwen";  //这种形式更加简洁,实际开发中常用

这里要注意的是:字符数组只有在定义时可以写入字符串,否则的话只能一个字一个字的赋值。

计算机并不如人聪明,人知道这个字符串啥时候结束机器不知道,因此要给字符串的末尾加一个结束标志“\0”。

接下来的划重点!

当字符串逐字赋值时:char str[] = {'a', 'b', 'c'};这里的末尾是不会有结束字符的。

一次性赋值时:char str[7] = "abc123";这里的结尾时有一个结束字符的。

注意看我给str开辟的空间是7,不是6,这是为了给结束字符留一个空位。

看到这里有时候就有人问了:这结束标志有什么用呢,数组就那么长你还能读多了?

欸!你说的对,计算机真的不懂你说的是啥,计算机找不到结束标志就会继续向后找,甚至是跑出内存,最后生成乱码。

这是一个难点,大家自己使用时一定要记得结尾给一个结束标志,别多想,就是直接赋值为0就好

char str[] = {'a', 'b', 'c',0};
char str[] = {'a', 'b', 'c','\0'};
char str[] = "abc"

好了要讲完了,最后一点:

结束字符'\0'不算在字符串长度里,所以用length是检测不到结束字符的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值