指针 这东西对于初学者来说 指针通常是比较难以理解的
在使用指针的时候 有时产生的调式问题连富有经验的程序员都觉得头疼
然而 指针不管是在C语言 还是 C++中 指针都是一个非常重要的组成部分
具体来说 指针保存的是另一个对象的地址
上图中 第二条语句定义了一个指向string类型的指针str 并初始化str 使其指向string类型对象s
*str中的*操作符表明str是一个指针变量 &s中的&符号是取地址操作符
当此操作符用于一个对象上时 返回的是该对象的存储地址
所以在后面的输出中 str的值是在计算机中的存储地址 *str输出的是str指针所指向的string类型变量s的值
注意:虽然在C/C++中 指针是一个非常重要的部分 但是在平常的编程中 建议尽量避免使用指针与数组
指针和数组容易产生不可预料的错误 其中一部分是概念上的问题 指针用于低级操作
容易产生于繁琐细节相关的错误 其他的错误源于使用指针的语法规则
我们在C++中 可以使用vector类型来代替一般的数组 string类型可以取代C中间的字符串数组
指针变量的定义
int *it; string *st; double *db; vector<T> *v;
在这里 有一点需要说明 指针变量定义的时候 *符号的位置 本身是没有要求的 以下的写法都是可以得
int *it; int* ti; int*tt; string *st; string* ts; string*ss;
不过有一点 上面的写法都是可以得 不过在程序中 *符号视为和你后面定义的指针变量名是一起的
所以如果你要同时声明俩个同类型的指针变量
string *p1,p2;//这样编写的话 只有p1是指针变量 p2只是一个string类型的变量 string *p1,*p2;//这才是同时声明俩个指针变量的正确声明
指针可能的取值有以下三种情况
string s("hello"); int *p1=0; int *p=NULL;//指针变量不指向任何东西 为空NULL string *str = &s;//指针变量指向string类型对象s 也可以使用另一个指针变量赋值 double *db;// 没有初始化
在平常的使用中 我们要避免使用没有初始化的指针 因为没有初始化的指针 通常会导致程序崩溃
如果可以的话 除非所指向的对象已经存在 不然不要先定义指针 这样可以避免定义一个没有初始化的指针
如果一定要先定义指针变量 再定义对象的话 我们应该在指针变量声明之时 将指针初始化为0
另外还有俩种特殊的指针void*指针与 const*指针
void*类型的指针 可以指向除了const*类型的指针变量外的所有指针变量
const类型的变量 不能够使用非const*类型的指针
非const类型的变量 可以使用const*类型的指针
不过只要是使用了const*类型的指针 我们就不能修改其所指向对象的值