指针类型
每个指针都有一个相关的类型。不同数据类型的指针之间的区别不是在指针的表示上,也不在指针所持有的值(地址) 上——对所有类型的指针这两方面都是相同的.
不同之处在于指针所指的对象的类型上。指针的类型可以指示编译器怎样解释特定地址上内存的内容 以及该内存区域应该跨越多少内存单元
通过在标识符前加一个解引用操作符 *来定义指针
int *ip1, *ip2;
complex<double> *cp;
string *pstring;
vector<int> *pvec;
double *dp;
在下面的例子中 lp 是一个指向long 类型对象的指针 而lp2 则是一个long 型的数据对象 不是指针
long *lp, lp2;
注意:
// 喔: ps2不是一个字符串指针
string* ps, ps2;
当指针持有0 值时 表明它没有指向任何对象
int ival = 1024;
// pi2被初始化为 ival的地址
int *pi2 = &ival;
// ok: pi和 pi2现在都指向 ival
pi = pi2;
// 现在 pi2没有指向任何对象
pi2 = 0;
指针不能被初始化或赋值为其他类型对象的地址值 例如
double dval;
double *pd = &dval;
// 都是编译时刻错误
// 无效的类型赋值 : int* <== double*
pi = pd;
pi = &dval;
当然 如果我们要做的 仅仅是持有地址值 可能是把一个地址同另一个地址作比较那么指针的实际类型就不重要了 C++提供了一种特殊的指针类型来 支持这种需求 空 void* 类型指针 它可以被任何数据指针类型的地址值赋值( 函数指针不能赋值给它) 怎么理解?
// ok: void* 可以持有任何指针类型的地址值
void *pv = pi;
pv = pd;
void*表明相关的值是个地址,但该地址的对象类型不知道。我们
不能够操作空类型指针所指向的对象 只能传送该地址值或将它与其他地址值作比较
已知一个int 型指针对象pi 当我们写下pi 时
// 计算包含在 pi 内部的地址值
// 类型 int*
pi;
这将计算pi 当前持有的地址值 当我们写下&pi 时
// 计算 pi 的实际地址
// 类型 : int**
&pi
指针的算术运算
int i, j, k;
int *pi = &i;
// i加 2 (i = i + 2)
*pi = *pi + 2;
// 加到 pi包含的地址上
pi = pi + 2; //pi指针向后移两个单位
string 类型能够自动将C 风格的字符串转换成string 对象 例如 这使我们可以将一个C 风格的字符串赋给一个string 对象
string s1;
const char *pc = "a character array";
s1 = pc; // ok
但是,反向的转换不能自动执行,对隐式地将string 对象转换成C 风格的字符串,string 类型没有提供支持
char *str = s1; // 编译时刻类型错误
为实现这种转换 必须显式地调用名为c_str()的操作
const char *str = s1.c_str(); // ok