C++提供了两种类似于vector与iterator的低级复合类型——数组和指针。array~~vector 而 iterator~~pointer。主要的区别在于:数组的长度是固定的,一经创建那么就不允许添加新的元素。指针可以像iterator一样用于遍历和检查数组中的元素。
高级提醒:现在C++编程中,尽量使用Vector和iterator类型,少使用array与pointer类型。但是,使用array有一个好处,就是可以提高性能,在这种情下,使用vector无法达到性能要求时,才可以使用array。
1. 对于数组维数中的值,我们只能够使用常量,或者初始化的const类型的对象。而非const变量以及要到运行阶段才能知道其值的const变量都不能用于定义。
2. 字符数组:char ca1[] = {'C', '+', '+'}; // no null;3
char ca2[] = "C++"; //null terminator added automatically.4
3. 不允许直接给数组进行复制和复制。
fg:int ia[]={0,1,2};
int ia2[](ia); // error;
int ia3[3];
ia3=ia; //error;
4. 数组的下标类型可以用size_t来表示。vector的下标使用的是size_type类型。
指针
指针是用于指向对象的。
fg:string* fp; fp定义为了一个指向string类型的指针对象。
提示:识别时我们可以从右往左去识别定义的指针变量。
对于指针星号的位置,可以挨着类型名也可以挨着变量名。两种风格,使用哪个都可以,只要延续使用一种就可以了。
高级提示:如果可以不定义指针的话,就先别定义,等到对象已经存在的时候再定义指针,这样可以避免未初始化的错误。另外,就是如果必须定义时,就把指针初始化为null。此时程序是能够判断该指针并为指向一个对象。
给指针赋值的情况:
1)0值常量可以;2)类型匹配的对象地址可以;3)对象下一地址可以;4)另一个指针可以;
运行把数值0 或在编译时可以获得0的const值赋给指针。
void*实际上就是一种黄金,通用的,到哪里都可以使用的。可以保存任何一种类型的指针。
重点:
指针和引用的区别:
1)引用定义必须初始化,因为它是指向一个对象的。
2)给引用赋值就是给引用所关联的对象赋值。
二级指针。指向指针的指针。二级地址。;;;;;;;;;;;;;;;;;;;;;;;
数组的输出:
也可以给数组设置一个哨兵:
int int_arr[] = {0,1,2,3,4};
for(int* pbegin = int_arr,*pend = int_arr + 5; pbegin != pend; pbegin ++)
{
cout << *pbegin << ' ';
}
同理:指针就是数组的迭代器;
for(vector<int>::iterator iter = ivec.begin();iter!=ivec.end();iter++)
{
*iter = 0;
}