第四章 数组和指针
C++语言提供了两种类似于vector和迭代器类型的低级复合类型----数组和指针。因此学习数组和指针时注意联系vector,比较他们的特点以及优缺点。现代C++程序应尽量使用vector和迭代器类型,设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。4.1 数组
4.1.1数组的定义和初始化
静态定义数组时 int a[n];n只能是整形字面值常量(10),枚举常量,或者用常量表达式初始化的整形const对象(const int n=10)。动态定义数组在下面介绍。
1,显示初始化
int a[]={1,2,3};
2,不允许数组直接复制和赋值。
Int a[]={1,2,4};
int a2[](a);//error
int a3[3]=a;//error
4.1.2 数组操作
1.数组下标的正确类型是size_t(应该是用typedef定义的无符号整数)4.2 指针的引入
1.指针用于指向对象。Type *ptr;ptr是一个指向type类型对象的指针。ptr=0(ptr=NULL)作用相同。2.void*指针,它可以保存任何类型对象的地址,它不允许操纵它所指向的对象,但可以重新获取存储在void*指针中的地址。
3.指针(指向对象)和引用(对象的别名)的比较:1.引用总是指向某个对象:定义时没有初始化是错误的(非const引用必须初始化为对应类型的引用 int &a=b;不能初始化为字面值常量。而const引用可以。)。2.赋值行为的差别:给引用赋值修改的是该引用关联的对象的值,
而并不是使引用与另一个对象关联。
4.使用指针访问数组元素
(1)指针的算术操作,标准库类型ptrdiff_t 用于指针相减的操作,是带符号的。可以结合解引用操作与算术操作来访问并操作数组。类似与迭代器的作用。
(2)计算数组的超出末端指针,类似与迭代器,数组也有超出末端指针。
Int a[10];
int *ptr=a+10;//ptr是数组a的超出末端指针。
允许计算数组或对象的超出末端的地址,但不允许对此地址进行解引用操作。
5.指针和const限定符
(1)指向const对象的指针 必须具有const特性const a=10;
const int *ptr=&a;
const限定了ptr指针所指向对象的类型,而非ptr本身。也就是说ptr本身不是const,允许给ptr重新赋值.
(2)const 指针
int *const ptr=&a;
指向const对象的const指针
4.3 创建动态数组
自由存储区:程序的一块可用的内存空间,用于存放动态分配的对象,c中用malloc 和freee 而c++用new delete。1.动态数组的定义
int *ptr=new int[n];n可以是运行时才知道的变量。
初始化也更加灵活
int *a=new int[n]();//全部是0
int *a=new int[10](1);
delete []a;//别忘了[]。
可见new返回的是一个指针。