目录

【飞郁2022新课程】16 - 数组和字符串

前面讲到了数据类型讲到过字符数组

有的同学对 数组 还不太理解

那么今天我们讲解的是 数组 和 字符串以及一些编码

好了 开始我们的讲解

一、数组

首先我们讲解数组 那么什么是数组呢?

我们把数组 这2个字拆开理解

1.“数”:数据

2.“组”:编组 编制成一个组 一个队伍

3.合起来就是:把一些相同类型的数据编制到一个组里 方便管理

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/5d5a7ec2c68f61a32e0f2bfc8689a6b9b2c51690.png@804w_188h_progressive.png

写法:

数据类型 变量名[数组成员数大小];

数据类型 变量名[数组成员数大小]={0};//初始化版本

1
2
3
int iArray[7];//没有初始化
int iArray[7]={0};//初始化为0
int iArray[7]={1,2,3,4,5,6,7};//初始化值

1.1 数组的初始化

1
2
3
int iArray1[10];//没有初始化
int iArray2[10]={0};//初始化
int iArray3[]={1,2,3};//省略写法 自动推到出成员个数

1.1.1 注意:

int iArray2[10]={0};//初始化

这里虽然只有一个0,但是他的作用就是把10个int类型的数组全部清空为0(我们一般把清空默认为0,也可以为其他值).

调试看下变化情况

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/8f951d262b500905de11d843b27573207209609b.png@942w_93h_progressive.png

经过“{0}”初始化后, 我们观察内存

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/6b186548bcf41469e1aa6c234a4fc27970c89c16.png@942w_99h_progressive-20211129154525448.png

1.2. 数组下标访问数组成员 和 赋值数组成员

1
2
3
4
int iArray[10]={0};
printf("%d\n",iArray[0]);
iArray[0]=1;
printf("%d\n",iArray[0]);

1.3 访问下标最大范围 从0开始到最大成员减1,杜绝访问下标冲突,引起的访问冲突异常

1
2
3
4
5
6
int iArray[10]={0};
printf("%d\n",iArray[0]);
iArray[0]=1;
printf("%d\n",iArray[0]);
//iArray[10]=1;//错误 会报异常 访问冲突
//iArray[9]=1;//正确

其实上面我们讲到的是1维数组 那么有二维数组 吗?那么三维呢? 多维呢?

肯定是有的 基本写法是 每多一个维度 就要多加一个[数量] 这里我们稍微的知道有这些东西就行了

不便多讲,以后会逐步加深难度

int iArray[10][10]={0};//相当于10行10列

二、注意事项

1.从索引0开始访问 访问全部数据.

2.要初始化 避免一些乱码.

3.防止数据下标越界 引起访问冲突.

4.数组成员的地址是连续的 线性关系.

5.数组成员的初始化 看内存窗口中比较初始化前后数据变化 结合上面的图讲解起内存地址是连续的 线性关系.

6.数组变量名就是一个地址.

7.定义数组大小的时候必须是一个常量,不能是变量,也就是说在我们编译的时候必须明确指定数组的大小.

三、字符串

在讲到数据类型的时候我们已经讲到过了字符串,这里我们再简单的看看

字符串顾名思义就是把多个字符“串”在一起就成了字符串

其实也很好理解 数组也就是把多个数据紧紧的排列在一起

同时在C语言中定义字符串是以\0为结束标志,也就是说当读内存的时候一个字节一个字节的读知道遇到\0为止

3.1 例如

char cc[5]={'H','e','a','r','t','\0'};//注意要用单引号来表示字符类型哦

我们这里打印下看看

1
2
3
4
5
6
7
8
void main()
{
  char  cc[6]={'H','e','a','r','t','\0'};//注意表示字符串的话 要'\0'结尾哦
  printf("cc = %s\n ",cc);//%s表示 输出的值的类型是 字符串类型
  printf("          char  cc[6] 大小=%d\n",sizeof(cc));//其实也就是6个字符表示的一个字符串

  system("pause");//暂停的意思 以免控制台消失
}

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/2a76280dcc4ffe5012a5f67daab4997270f1aa9c.png@668w_197h_progressive-20211129154604570.png

四、字符串编码简介

讲了字符串 我们这里就要简单的说下字符串编码问题

现在主流的编码有

ascii

unicode

utf-8

big5

他们都是按照某种规范去编制字符的

有的是 一个字符 一个字节表示 有的是2个 甚至是3个 多个的情况都有

这里简单的讲下

4.1 ASCII

char c[2]={'a','b'};//查看ascii表 一个字节来表示

观察内存

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/8971ce863d20464119653d19be06c89529a67a0b.png@386w_146h_progressive-20211129154621316.png

我们可以观察到61,62 都挨着一起,我们的字符“a”就是用0x61来表示的,这是遵循了ASCII表

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/5ba3de240925cb7930d5a147f11f264866aa5c3f.png@942w_638h_progressive.png

4.2. UNICODE

我们再来看看unicode编码的形式

wchar wc[2]={'a','b'};//我们看内存 是2个字节表示的

继续观察内存

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/d2a5e671eaa578170c79cd176b4610ecd68f3b2b.png@383w_150h_progressive-20211129154634071.png

发现每一个字符占2个字节,这样编码是为了扩展更多的字符,因为ASCII每一个字符只占一个字节,我们知道一个字节最大值的表示范围在0到255,也就是最多只能表示256个字符,但是unicode就不一样了 ,它每一个字符占2个字节,也就是说2个字节最大表示范围在0到65535,一共可以存65536个字符.

4.3 其他编码

utf-8 和 big5 由于代码有些超纲 这里不便多讲 后面也会给同学们细细道来 不要着急

其实他们的原理都差不多

后面bird老师给带领大家对编码有进一步的认识