引用&指针

引用

   引用(&) 相当于给一个对象另起的名字,与之连接绑定,其中一个改变,另一个绑定的也会改变.

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 = &Pi;
void* pp = &Pi; //可以是任意类型的对象
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

                                 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值