简单理清操作符 & 和 *

#空了好久一段时间没打代码,一些简单的操作符又混淆了,好记性不如烂笔头,还是自己花点心思做做笔记。

 

首先,我们要搞定 非常非常...非常 基础的概念:什么是操作数,什么是操作符

用理论的话来讲:

  • 操作数操作符构成了表达式
  • 操作数是运算符作用于的实体,规定了指令中进行数字运算的量
  • 操作符是一个表示特定的数学或逻辑操作的符号,表示该指令应进行什么性质的操作

大白话直接来看例子:

1+a、&b、*var、......     形如 表达式中1、a、b、var 的常量或者变量就称为操作数,+、&、* 的运算符就称为操作符

 

然后,什么是指针

指针是一个 包含了另一个变量地址 变量,变量可以是任意数据类型,包括对象、结构或者指针。

在C++语言中,地址也称为指针

 

ok,接下来进入正题。

C++提供了两种指针运算符取地址运算符&间接访问运算符 *

 

取地址运算符&

功能:返回变量的内存地址

大白话:&b 就是 变量b的地址

例1: 

int *p, m;  //定义 p 为指向int类型的指针,同时定义变量 m
m = 200;    //将数值 200 赋给变量 m
p = &m;     //将变量 m 的地址值赋给指针变量 p
图(1).指针变量的意义

此时,变量在内存中的存储状况如图(1)所示,

假定变量 m 的地址是1024,其存储空间中所存放的内容是 数值200;

假定变量 p 的地址是2000,其存储空间中所存放的内容是 变量 m 的地址值1024。

 

值得注意的是,

地址都是整数,指针变量可以指向不同类型的变量,但是装的一定是整数,即32位的物理地址,故指针变量的大小也就是确定的,就是4个字节(32位),即下例中,sizeof(p1) = sizeof(p2) = sizeof(p3) = 4。

例2:

int a = 1, *p1;
float b = 0.5, *p2;
char c = 'C', *p3;

//注意指针变量的类型,只有相同类型变量的地址才能赋给该指针变量
p1 = &a;    //若出现 p1 =&b ,则是无意义的
p2 = &b;
p3 = &c;

 

间接访问运算符 *

功能:访问指针指向的变量。

例3:

int *p, m, n;

m = 200;  // 赋值,m == 200
p = &m;   // 赋值,p == 变量 m 的地址
n = *p;   // 等价,*p == m ;赋值,n == *p == m == 200
*p = 100; // 赋值,*p == m == 100

//故最后,m 的值为100,*p 与 m 等价, n 的值为200
图(2).指针变量的意义

假定变量 m 的地址是1024,其存储空间中所存放的内容是 数值200;

假定变量 p 的地址是2000,其存储空间中所存放的内容是 变量 m 的地址值1024。

对于间接访问 *p,c++内部处理是这样的:

  1. 先从变量属性表中取得 指针变量 p 的地址,即2000;
  2. 通过地址 找到指针变量 p,取出其存储的内容 变量 m 的地址,即1040;
  3. 通过地址 找到变量 m,访问其存储的内容,即值200。

总结一下:

已知    int *p, m;
            p = &m;

那么   *p 和 m 等价,对 m 可进行的所以操作 *p 都适用,
            p 和 &m 等价,使用 &m 和 使用 p 一样

 

二级指针 **

最后的最后,来讲讲 指向指针的指针

前面不是有说到

指针是一个 包含了另一个变量地址 变量,变量可以是任意数据类型,包括对象、结构或者指针。

那么就会存在 指向指针 的 指针,我们知道,C++中定义一个基本类型的变量时,该变量占用若干存储单元(第一个存储单元的地址为该变量的起始地址),同样,当定义一个指针变量的时候,该指针变量也占用若干存储单元,也存在起始地址。

int x = 3, *p1, **p2;

p1 = &x;
p2 = &p1;
图(3).指向指针的指针的意义​

假定变量 x 的地址是1000,指针变量 p1,内存中的存储状况如图(3)所示

此时,可以通过 p1 一级间接访问 变量 x, 即 *p1 和 x 等价

也可以通过 p2 二级间接访问 变量 x,即 **p2 等价于 *p1 等价于 x

对于二级间接访问 **p2,c++内部处理是这样的:

  1. 先从变量属性表中取得 指针变量 p2 的地址
  2. 通过地址 找到指针变量 p2,取出其存储的内容 指针变量 p1 的地址,即2000;
  3. 通过地址2000 找到指针变量 p1,取出其存储的内容 变量 m 的地址,即1000;
  4. 通过地址1000 找到变量x,访问其存储的内容,即3。

 

 

(以上就是我这次对 & 和 * 的一些浅薄的见解和简单的笔记,如有错误,还望各位大佬多多指教~~)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值