《每日一练合集》
2.11 C风格的字符串
C风格的字符串有两种:
- 字符串常量,由双引号包括的字符序列就是字符串常量,注意字符串常量存储在常量区,但是以数组定义的字符串常量是被拷贝到栈(或者静态区)中的,所以以数组定义的字符串是可以修改元素的。
- 末尾自动添加了结束符
\0
的字符数组
注意,结束符就是\0
,值为0,也就是NULl。有结束符的字符序列才可以称为字符串。
2.12 字符数组
字符数组的初始化可以使用字符常量或者常量字符串进行初始化:
而且在初始化的时候要注意,结束符也是占空间的。
结束符在字符串的处理中相当重要!!!这是因为许多的字符串处理函数都是以NULL为结尾处理字符串的。
2.13 二维数组的声明与初始化
二维数组的初始化分为两种:
- 按行初始化,给出每行的括号
- 顺序初始化,二维数组也是顺序存储的,所以顺序初始化没毛病
在声明初始化的时候,只有第一维是可以省略的,这个规则适用于更高维数的数组。二维数组来说就是,列数不可省略,如下:
2.14 二维数组的存储
首先,所有数组在内存中都是线性存储的,对于二维数组也是,但二维数组的线性存储分为两种情况:
- 行优先存储:这是多数编译器默认的,先顺序存储第一行的元素,再顺序存储第二行的元素,以此类推
- 列优先存储:先存储第一列的元素,再存储第二列的元素,以此类推
C/C++中默认按照行优先存储,可以在逻辑上转换为一维数组,即:
比如如下面这些题:
还有,在将二维数组转换为一维数组的时候,切记要通过指针的形式来做,不要凭感觉去,因为数组下标是从0开始的,很可能出现失误,如下:
2.15 二维数组的动态声明
注意,当动态声明数组的时候,数组相当于一个链表,因为数组的a[k]都是一个int*,所以动态申请的二维数组的元素不是连续的,所以我才说相当于一个链表。
注意释放的时候,先释放a[i]
,再释放a。