[c++primer][04]数组和指针
现代C++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针。设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。
4.1 数组
数组的维数必须用值大于等于1的常量表达式定义。非const变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。
初始化
如果没有显式提供元素初值,数组元素与变量初始化规则一致。
字符串字面值包含一个额外额空字符(null)用于结束字符串
const char ch[6] = “Daniel” ; //error: Daniel is 7 elements
操作
数组下标的正确类型是size_t
4.2 指针的引入
什么是指针
指针保存的是另一个对象的地址,&操作符只能用于左值
初始化
避免使用未初始化的指针
有效的指针或者保存一个特定对象的地址,或者指向某个对象后面的另一个对象,或者是0值(0值表明指针不指向任何对象)
指针也可使用预处理器变量NULL初始化,该变量在stdlib.h中定义,其值为0
void*指针
void*可以保存任何类型对象的地址,不允许使用void*指针操纵它所指向的对象
指针和引用
引用总是指向某个对象,定义引用时没有初始化是错误的;
给引用赋值修改的是该引用所关联的对象的值,引用一经初始化,就始终指向同一特定对象
使用指针访问数组元素
数组名是指向数组第一个元素的指针
C++允许计算数组或对象的超过末端的地址,但不允许对此地址进行解引用操作。
指针和const限定符
允许把非const对象的地址赋给指向const对象的指针
不能使用指向const对象的指针修改基础对象,然后如果该指针指向的是一个非const对象,可用其它方法修改所指的对象。
指针和typedef
typedef string *pstring; const pstring cstr;
const pstring是string *const 类型,即指向string类型对象的const指针(因为const修饰的是pstring类型,这是一个指针)
4.3 C风格字符串
含义
即以空字符null结束的字符数组(进行strncpy操作时,注意预留结束符的存储空间)
空字符(null): '\0' ascii码是0
空格(SPACE): ' ' ascii码是32
创建动态数组
程序执行时占用一块可用的内存空间,用于存放动态分配的对象,称为自由存储区或堆(heap)。C++使用new和delete在自由存储区分配空间。
动态分配数组时,如果数组元素具有类类型,则用该类的默认构造函数初始化,如果数组元素是内置类型,则无初始化。
int *pia = new int[10]; //array of 10 uninitialized ints int *pia2 = new int[10](); //加上空圆括号,对数组元素做值初始化,设置为0
允许动态分配空数组
size_t n = get_size(); // get_size returns number of elements needed int* p = new int[n]; for (int* q = p; q != p + n; ++q) /* process the array */ char arr[0]; // error: cannot define zero-length array char *cp = new char[0]; // ok: but cp can't be dereferenced
用new动态创建长度为0的数组时,new返回有效的非零指针。
新旧代码兼容
c_str()返回指向const char类型的数组,是C风格字符串。
const char *str = str.c_str(); //正确的初始化形式
数组指针可用来初始化vector对象(迭代器作用)
4.4 多维数组
基本概念
使用多维数组名时,将自动转换为指向该数组第一个元素(第一个内层数组)的指针
Because a multidimensioned array is really an array of arrays, the pointer type to which the array converts is a pointer to the first inner array. Although conceptually straightforward, the syntax for declaring such a pointer can be confusing:
int ia[3][4]; // array of size 3, each element is an array of ints of size 4 int (*ip)[4] = ia; // ip points to an array of 4 ints ip = &ia[2]; // ia[2] is an array of 4 ints
*ip是int[4]类型,即ip是指向含有4个元素的数组的指针
用typedef简化指向多维数组的指针
typedef int int_array[4]; //把int[4]类型定义为int_array int_array *ip = ia; for (int_array *p = ia; p != ia + 3; ++p) for (int *q = *p; q != *p + 4; ++q) cout << *q << endl;