引用
引用(&) 相当于给一个对象另起的名字,与之连接绑定,其中一个改变,另一个绑定的也会改变.
int a = 10086;
int &r1 = a;
r1 = 0;
// print r1=0 ; a=0
int c = 100;
c = a;
// print a = 100 ; r1 = 100
int &r2; // 错误 必须进行初始化! 不能被赋值!
PS: 每个开头必须用标识符& ; 引用的类型必须与对象的类型匹配 ; 无法重新引用绑定另一个对象!
指针
指针与引用的不同之处:
①指针本身为一个对象,允许对指针进行拷贝和赋值 , 可以先后指定好几个不同的对象 。
②指针不需要在定义的时候初始化或赋值。
获取对象的地址 取地址符(&):
int a = 1;
int *p = &a;
cout<<p<<" "<<*p; // 输出的p 为指针指向的对象的地址,输出的*p 为指针指向对象所访问的值
* 为解引用符
PS: 指针与指针所指向的对象类型需相同;
指针值的四种状态:
Ⅰ指向一个对象;
Ⅱ空指针;
Ⅲ无效指针;
Ⅳ指向紧邻对象所占空间的下一个位置;
空指针
空指针不指向任何对象
得到空指针的方法:
方法一:
int *p = nullptr; // c++11新标准
方法二:
include<cstdlib>
int *p = NULL;
方法三:
int *p = 0; //初始化,但不指向任何对象
错误方法:
int *p;
int a = 0;
p = a; //int变量直接赋值给指针 不行的喵
PS:C++最好使用nullptr 少用NULL; 若暂无指向,最好先将指针初始化为nullptr;
指针修改所指向对象访问的值:
int a = 100;
int *p = &a;
*p = 0;
// 修改后,输出a的值为0 ; 指针p所指向对象访问的值为0 ;指针所指向对象地址不变
PS: 类似于引用;
void* 指针
void*可以存放任意类型地址 , 但是不可以直接操作void*指针所指向的对象,因为无法确定是什么类型。
double Pi = 3.141;
double *p = Π
void* pp = Π //可以是任意类型的对象
pp = pd; //可以是任意类型的指针
可能会出现误会的地方
int* p 与 int *p 空格到底写在哪里,有时看题解或者其他文章会发现有这两种不同的写法,其实这两种写法是一样的,表达的意思也一样,没有谁对谁错这一区分,仅仅是写代码时候的习惯不一,从而造成了误解。两种写法都是合法的。
定义多个变量
int *p,pp //定义的是指针p 和一个 类型为int 的变量pp;
指针与引用的声明
两种方法:
方法一:
int *p,*pp;
方法二:
int *p;
int *pp;
指向指针的指针
**表示指向指针的指针,***表示的是指向指针的指针的指针,随着*的增加以此类推。
int a = 1;
int *p = &a; //p指向int 型的数
int **pp = &p; // pp指向int型的指针的指针
cout<<a<<*p<<**pp; // 三种输出方式 一种直接输出 第二种是通过int型指针p输出 第三种是经过两次解引用pp 得到a的值输出
输出结果均为1
指向指针的引用
int a = 10086;
int *p;
int *&r = p; //r为对指针p的引用
r = &a; //将r 赋值a 即令指针p指向a;
*r = 0; //解引用r得到i 将a的值变为0
*r *p解引用输出结果均为0