1、数组创建
一维数组创建的基本语法如下:
type arr_name[ 常量值 ];
存放在数组中的值称为数组的元素 。数组在创建的时候需要指定数组的大小 和数组的元素类型。
type 指定的是数组中存放的数据的类型 ,可以是:char、short、int、float 等,也可以自定义的类型;
arr_name 是数组的名字 ,这个名字是自定义的,根据实际情况,要求取的名字要有意义:
[ ] 中的常量值 是用来指定数组的大小 的,数组的大小根据实际需求指定就可以。
注意:可以使用 const 定义常量的方法,来指定数组的大小。
例如:
const int N = 100;
int arr [N];
举例创建一个整型数组来储存一个班上40个同学的年龄:
int age[ 40 ];
2、数组的初始化
数组在创建的时候,我们需要给定一些初始值,这就叫初始化。
int arr[ 5 ] = { 1 , 2 , 3 , 4 , 5 }; //完全初始化,数据会依次放入数组
int arr2[ 6 ] = { 1 }; //不完全初始化 ,第⼀个元素初始化为1,剩余的元素默认初始化为0
int arr3[ 3 ] = { 1 , 2 , 3 , 4 }; //这是错误的初始化,因为初始化项太多
3、数组元素访问
数组是有下标的,下标是从 0 开始 的。假设数组有 n 个元素,最后一个元素的下标就是 n-1 ,下标就相当于数组元素的编号,如下:
对于访问数组元素,C++提供了一个操作符**[ ]** ,这个操作符叫:下标引用操作符。
有了下标访问操作符,我们就可以轻松的访问到数组的元素了。比如我们访问下标为7的元素,我们就可以使用 arr[7] ,在上图中 arr[7] 就是 8 。想要访问下标是3的元素,就可以使用 arr[3] 。
4、数组元素的打印
使用 for 循环产生所有的下标,接下来使用下标访问符,打印出下标对应的内容即可。
注意:如果产生的下标超出了有效下标的范围 ,比如,使用负数作为下标,或者超出了下标
的最大值,再使用这个下标访问元素就会造成越界访问 。如果出现越界访问,代码编译
时语法不会报错,但是运行时会出问题。
(1)数组和sizeof
sizeof(数组名) ,计算的是数组的总大小 ,单位是字节。
sizeof(数组名) / sizeof(第一个元素) ,计算的是数组的元素个数。(数组是由元素构成的,整个数组的大小就是所以元素加起来的大小,由于每个元素的类型是一样的,那么拿整个数组的大小除以其中一个元素的大小得到的就是元素的个数,这还是很好理解的吧)
(2)数组元素的打印
5、范围 for
范围 for 是在 C++11 这个标准中引入的,如果你使用的编译器默认不支持 C++11 ,可能需要配置才能使用。
(1) 范围 for 语法
for ( 类型 变量名 : 数组名 )
语句 //多条语句需要加大括号
示例:打印数组
上面代码中的 for 就是 范围 for,代码的意思是将 arr 数组中的元素,依次放在 e 变量中,然后
打印 e,直到遍历完整个数组的元素。这里的 e 是一个单独的变量,不是数组的元素,所以对 e 的
修改,不会影响数组。
但是对于范围 for 要慎重使用!范围 for 是对数组中所有元素进行遍历 ,但是我们实际在做题的
过程中,可能只需要遍历数组中指定个数的元素,这种情况下范围 for 就不合适了。
(2)auto 关键字
auto 的主要用途是让编译器自动推导出变量的类型。
使用 auto 类型,上面的范围 for 也可以这样写:
范围 for 中 e 前面的类型可以是 auto 关键字,当你不知道数组中放什么类型的时候,就可以使用 auto 作为类型,auto 在范围 for 中很常用。如果明确的知道数组元素的数据类型,也可以将 auto 换成对应的数据类型。
6、memset设置数组内容
(1)memset
void * memset ( void * ptr, int value, size_t num );
ptr 是指针,指向要设置的内存块的起始位置; value 是要设置的值 ;num 是要设置的字节个数。
memset 是用来设置内存 的,它会将内存中的值以字节 为单位设置成想要的内容,需要头文件**<cstring>** 。
(2)设置数组内容
(3)错误使用
这是为什么呢?接下来画图解释:
memset 函数是给每个字节设置 value 值,而⼀个整型元素占用4个字节,一个整型的每个字节都被设置为1,二进制就是: 00000001 00000001 00000001 00000001 ,转换成十进制就是:16843009 ,因此结果是不符合预期的。
7、memcpy拷贝数组内容
C++中有⼀个库函数 memcpy 可以做数组内容的拷,memcpy 实际是用来做内存块的拷贝的,当然用来做数组内容的拷贝也是没问题的。memcpy需要的头文件是 <cstring>。
void * memcpy ( void * destination, const void * source, size_t num );
destination 是目标空间的起始地址 ;source 是源数据空间的起始地址 ;num 是拷贝的数据的字节个数。