C/C++中的*和&

最近看程序的时候对&和*的理解还是有点问题,索性写篇文章重头理清一下。

首先,左值和右值的问题。

我们知道对于*和&,左值和右值的含义是不一样的,如

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.     int a = 0;
  5.     int *p = &a;
  6.     printf("The value is: %d/n", *p);
  7.     return 0;
  8. }

*表示的是指针,int 是指针的类型,int *p是定义一个整型的指针p,指向的是变量a的地址.而等式右边的&是取地址,&a是变量a的地址。可以看出,左边的*和右边的&是相对应的,我们只能把右边变量的地址值赋给指针,而不能把变量直接赋给指针。

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.     int a = 0;%地址是0x0012ff60
  5.     int *p = a;
  6.     printf("The value is: %d/n", *p);
  7.     return 0;
  8. }
有意思的是,即使我们知道&a的输出值是1638208,我们也不能直接把1638208赋给*p,如下是运行不了的

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.     int a = 0;%地址是0x0012ff60
  5.     int *p = 1638208;
  6.     printf("The value is: %d/n", *p);
  7.     return 0;
  8. }

综上,

*作为左值时,是类型,int *p可以理解为int* p,p是整形指针类型,存储的值是与整形指针类型对应的地址类型&a,而且这个地址中存储的值也是整数类型的,地址&a(p)可以以整数的形式显示出来,但是不能接受整数的赋值。

*作为右值时,是操作,p本身是指针类型,但是p的值是地址,*p可以理解为通过指针类型p中的地址去找到地址中的值。

&作为左值时,是类型, int &p=a是定义一个整形的引用p.

&作为右值时,是操作,取地址的操作。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值