- 现代c++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针.设计良好的程序只有在强调速度时才在类内部使用数组和指针.
- 数组和容器的相同点和不同点
相同点: 都是存储单一数据类型对象的容器
不同点:
1)数组的长度是固定的,而且程序员无法知道一个给定数组的长度(没有获得其容量大小的size操作),也不提供push_back操作
2)如果要更改数组的长度,只能创建一个更大的数组,然后将原数组中的元素copy过去.
- 数组初始化实例
int staff_size = 27;
double salaries[staff_size];
const unsigned array_size = 3;
int ia[array_size] = {0,1,2};
int ca1[] = {0,1,2};
char ca2[] = "C++";
- 指针和迭代器的异同点
相同点:指针和迭代器一样,提供对所指对象的间接访问
不同点:指针指向单个对象,而迭代器只能用于访问容器内的元素.
- 指针使用实例
string s("hello world");
string *sp = &s;
double *dp;
double* dp1, ps;
- 指针可能的取值
保存一个对象的地址、指向某个对象后面的另一对象(???没查到什么意思)、0值(表明不指向任何对象)
- 指针初始化和赋值操作的约束
对指针初始化或赋值只能使用以下四种类型的值:
1)0值常量表达式: 字面值常量0或可获得0值的整型const对象
2)类型匹配的对象的地址
3)另一对象之后的下一地址
4)同类型的另一个有效指针
int ival;
int zero = 0;
const int c_ival = 0;
int *pi = ival;
pi = zero;
pi = c_ival;
pi = 0;
int * pi = NULL;
double dval;
double *pd = &dval;
double *pd2 = pd;
int *pi = pd;
pi = &dval;
- void*指针
double obj = 3.14;
double *pd = &obj;
void *pv = &obj;
- 指针解引用操作
string s("hello world");
string *sp = &s;
cout<<*sp;
*sp = "goodbye";
string s2 = "some value";
sp = &s2;
- 指针和引用的比较
1)引用总是指向某个对象,定义引用时没有初始化是错误的
2)给引用赋值修改的是该引用关联的对象的值,而并不是使引用与另一个对象关联
int ival = 1024, ival2 = 2048;
int *pi = &ival, *pi2 = &ival2;
pi = pi2;
int &ri = ival, &ri2 = &ival2;
ri = ri2;
- 指向指针的指针
int ival = 1024;
int *pi = &ival;
int **ppi = π
int *pi2 = *ppi;
- 使用指针访问数组元素
int ia[] = {0,2,4,6,8};
int *ip = ia;
int *ip = &ia[0];
int *ip2 = ip + 4;
int *ip2 = ia + 4;
int last = *(ia + 4)
- 下标和指针
int ia[] = {0,2,4,6,8};
int i = ia[0];
int *p = &ia[2];
int j = p[1];
int k = p[-2];
- 指向const对象的指针
如果指针指向const对象,则不允许用指针来改变其所指的const值,为了保证这个特性,c++要求指向const对象的指针页必须是const的.
const double *cptr;
*cptr = 42;
const double pi = 3.14;
double *ptr = π
const double *cptr = π
void *pv = π
double dval = 3.14;
cptr = &dval;
*cptr = 3.1415;
dval = 3.1415;
- const指针
int errNumb = 0;
const int errNumb1 = 0;
int *const curErr = &errNumb;
const int *const curErr1 = &errNumb1;
typedef string *pstring;
const pstring cstr;
- 动态数组的定义
string *psa = new string[10];
int *pia = new int[10];
int *pia = new int[10]();
int pia = new int[10];
char arr[0];
char *cp = new char[0];
delete [] pia;
- 使用数组初始化vector对象
const size_t arr_size = 6;
int int_arr[arr_size] = {0,1,2,3,4,5};
vector<int> ivec(int_arr,int_arr+arr_size);
- 指针与多维数组
int ia[3][4];
int (*ip)[4] = ia;
ip = &ia[2];
typedef int int_array[4];
int_array *ip = ia;
int (*ip)[4] = ia;