对应于容器(vector)和迭代器(iterator),C++从C语言继承了数组和指针。
4.1数组
数组时由类型名、标示符和维数组成的符合数据类型。
没有所有元素都是引用的数组。
【数组定义和初始化】
数组的维数必须是大于或者等于1的常量表达式,如果需要计算才能确定,必须使用new或者malloc。
可以在定义的时候将初始化值写在{}中,如下:
int array[5] = {0,1,2}
则,a[0]到a[2]初始化为0、1、2,而后面的a[3]和a[4]为0
对于没有显示初始化的数组:
- 如果定义在函数体外,全部初始化为0
- 函数体内定义的,不初始化
- 不管在内外,如果是类类型的,调用默认构造函数。(必须提供)
对于字符类型的数组(字符串)
可以使用字符串字面值进行初始化,例如:
char a[7]="Hello!";
但是要注意,此时为7个字符,因为默认在最后面加了一个'\0'
不能使用一个数组对另外一个数组进行初始化。
【数组操作】
数组可以用下标访问其中的元素,类型是size_t(vector是vector::size_type)。
需要非常注意数组的下标越界问题。
4.2指针
指针式指向某种类型对象的符合数据类型,是用于数组的迭代器。
简单来说,指针保存着另外一个变量(对象)的地址。
string s="Hello World";
string *sp = &s;
如上,使用&操作符来取地址,这个操作符只能用于左值。
【指针定义和初始化】
每个指针都与其指向的数据类型关联,不能把int指针指向float变量。
使用*符号把一个标示符声明为某类型指针,例如:
int *pi;
注意,*号只对其后面的一个变量起作用,再往后的变量不会被声明为指针。
好的格式:int *a,*b,*c; //好!
错的格式:int* a,b,b; //错误,而且不好,因为只有a是指针!
指针只可能取3个数值:一个对象的地址,指向对象后面的另一个对象,或者是0(NULL)。
指针定义后,使用前,一定要初始化!
只能用以下几种类型之一对指针进行初始化:
- 0值常量表达式(NULL)
- 类型匹配的对象地址
- 另一个对象后的下一个地址
- 同一类型的另外一个指针
其实只多了一个,可以把另外的指针拿来初始化。
void*是一种万能指针,可以存储任何类型指针的地址,但是,不能对void*解引用!
未完待续