C++ 指针变量与变量的关系(附图详解)


假设我们有一个整形变量 :

int val = 42;

接着创建一个指针变量,p为指针变量的变量名

int *p;

目前的状态:

val为变量的值,42;&为取地址符,&val就是val的地址。

附:

区分引用与取地址符的差别:

  1. &符号放在一个变量初始化的时候就是引用,例 :int &rN = N;;
  2. 如果放在一个已经定义的变量前,就是取地址

因为我们的指针未初始化,所以现在是一个野指针。在这里就相当于什么都不是。(空指针指的是NULL,要加以区分)

附 :

野指针的成因:

  1. 未初始化,没有设置为NULL或者指向合理内存;
  2. 在free或者del之后未赋值NULL。free和del只是把指针所指的内存释放,但并没有把指针本身干掉。此时指针指向的就是垃圾内存。所以释放内存后应该立即将指针设置为NULL。

现在我们将指针指向变量

*p = &val;

目前的状态:

我们可以看到,在指针指向后,指针变量内部存入了整型变量的地址:

  • 使用p可以将该内存空间(指针变量内部)内的值取出,为整型变量的地址00DBFDD0;
  • &val与p的值相同,但是性质却不同,&val这个指令代表将val的地址取出,为00DBFDD0;
  • p代表将指针变量的值取出,值为00DBFDD0;
  • 00... 代表 指针变量p 这个变量所在内存空间的地址;
  • val可以将整型变量的值取出,为42;
  • *p可以将该指针变量所指的整型变量的值取出,为42;
  • 需要注意的是:我们使一个指针变量指向另一个变量的时候,使用的指令是*p = &val;代表着将那个变量的地址赋予指针变量p,在这个瞬间p就变为了00DBFDD0,这并不意味着*p == &val,要认识到这两者的不同。

接下来,我们将另外一个指针指向我们刚刚那个指针,看看是什么一个状态:

int *a = p;

或者

int *a = &(*p);

效果都是一样的,只不过本质上

  1. 第一个是将指针变量p的值(整型变量的地址)赋给指针变量a;
  2. 第二个是将    *p (也就是指针变量p所指的整型变量val)  的地址赋给指针变量a,等同于 *a = &val

可能会有点绕,读者可以慢慢品味一下。


于是目前的状态就变成了:

可以看到42那里的状态又更新了。要注意指针变量a与p在两个不同的内存空间,所以它们的地址是不同的,也就是&a与&p不同。

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值