指针
获取对象的地址(指针初始化)
int ival = 45;
int *p = &ival;
利用指针访问对象
如果指针指向了一个对象,则允许使用解引用符(*)来访问该对象,比如:
int ival = 42;
int*p = &ival; //定义一个指向ival的指针
std::cout << *p;
*p = 0; //改变*p所指向的对象,即经由指针p改变ival的值
std::cout << *p; //输出0
空指针
空指针表明指针不指向任何对象,以下是几种生成空指针的办法
int *p1 = nullptr; //等价于int *p1 = 0,推荐使用这种方法
int *p2 = 0; //直接将p2初始化为字面常量
//需要首先#include cstblib
int *p3 = NULL; //等价于int *p3 = 0
ad:需要指出的是,这里的0和int类型中的0不是一个概念,下面的这段代码就会报错
int zero = 0;
pi = zero;
赋值和指针
就是说指针可以在生命周期内志向不同的地址,从而指向一个新的对象
int i1 = 0 , i2 = 1;
int *p = &i1;
std::cout << *p << " ";
p = &i2;
std::cout << *p;
//输出结果为0 1
其他指针操作
需要记下来的也就是指针的判断了
如果指针为空,则条件取false,如果指针不空,则条件取true(可以在指针使用之前加一个判断,避免其为空指针)
//一个栗子
int i = 42;
int *p = &i;
int *p1 = nullptr;
if(p)
std::cout << "p is not empty" << std::endl;
if(p1)
std::cout << "p1 is not empty";
else
std::cout << "p1 is empty";
另外对于两个同一类型的指针可以用==和!=来进行比较,返回的是bool类型,如果两个指针存放地址相同,则判定相等;反之,不等。
void*指针
void* 指针可以指向任意对象的地址,但存放后我们对该地址的数据类型是未知的,因此他能做的事情比较有限:
拿它与别的指针比较、作为函数的输入输出,赋值给另外一个void* 指针,不能直接操作void* 指针所指的对象
指向指针的指针(套娃 @_@)
简单来说,举个例子:
** 表示指向指针的指针,*** 表示指向指针的指针的指针
int ival = 42;
int *p = &ival; //指向ival的一个指针
int **pp = &p; //指向指针p的指针
那么如果我们要通过pp来访问ival,那么无疑要用到两次解引用:
std::cout << **pp;
指向指针的引用
下面看一个例子:
int ival = 42;
int *p; //一个指针
int *&r = p; //指向指针的一个引用r
r = &ival;
std::cout << "*r = " << *r << " *p = " << *p << std::endl;
//输出42 42
*r = 0;
std::cout << "*r = " << *r << " *p = " << *p << std::endl;
//输出0 0