c++ 数组

150 阅读2分钟

显式初始化:

const unsigned sz = 3;
int ial[sz] = {0,1,2};
int a2[] = {0,1,2};
int a3[5] = {0,1,2};
string a4[3] = "hi","bye"
int a5[2] = {0,1,2}

字符数组初始化,可以用字符串字面值的形式,当使用这种方式时, 一定要注意字符串字面值的结尾处还有一个空字符,这个空字符也 会被拷贝到字符数组中:

char a1[] = {'c','+','+'}; //列表初始化,没有空字符
char a2[] = {'c','+','+','\0'}; //列表初始化,含有显式空字符
char a3[] = "c++";//自动添加表示字符串结束的空字符
const char a4[6] = "Danial"; //错误,没有空间可存放空字符

不允许拷贝和复制
不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组给其他数组赋值

int a[] = {0,1};
int a2[] = a;//错误:不允许使用数组初始化另外一个数组
a2 = a;//错误,不能把数组直接赋值给另外一个数组

复杂的数组声明

//ptrs是含有10个整型指针的数组
int *ptrs[10];
int &refs[10] = /*?*/ //错误,不存在引用的数组
int (*Parray)[10] = &arr;//Parray指向一个含有10个整数的数组
int (&arrRef)[10] = arr;//arrRef引用一个含有10个整数的数组

访问数组元素 在使用数组下标时,通常将其定义为size_t类型,size_t被设计得足够大,能表示 内存中任意对象的大小。

指针和数组 数组有一个特性,在很多用到数组名字的地方,编译器都会自动地将其替换成一个指向数组 首元素的指针

int a[3][4];
inr *p = a; //等效于int *p = a[0];

在大多数表达式中,使用数组类型的对象其实是使用一个指向数组首元素的指针
在使用多维数组的名字时,也会自动将其转换成指向数组首元素的指针

因为多维数组实际上是数组的数组,所以多维数组名转换得来的指针实际上是指向第一个 内层数组的指针。

int ia[3][4]; //大小为3的数组,每个元素使含有4个整数的数组
int (*p)[4] = ia;
p = &ia[2];