#空了好久一段时间没打代码,一些简单的操作符又混淆了,好记性不如烂笔头,还是自己花点心思做做笔记。
首先,我们要搞定 非常非常...非常 基础的概念:什么是操作数,什么是操作符?
用理论的话来讲:
- 操作数和操作符构成了表达式
- 操作数是运算符作用于的实体,规定了指令中进行数字运算的量
- 操作符是一个表示特定的数学或逻辑操作的符号,表示该指令应进行什么性质的操作
大白话直接来看例子:
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)所示,
假定变量 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
假定变量 m 的地址是1024,其存储空间中所存放的内容是 数值200;
假定变量 p 的地址是2000,其存储空间中所存放的内容是 变量 m 的地址值1024。
对于间接访问 *p,c++内部处理是这样的:
- 先从变量属性表中取得 指针变量 p 的地址,即2000;
- 通过地址 找到指针变量 p,取出其存储的内容 变量 m 的地址,即1040;
- 通过地址 找到变量 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;
假定变量 x 的地址是1000,指针变量 p1,内存中的存储状况如图(3)所示
此时,可以通过 p1 一级间接访问 变量 x, 即 *p1 和 x 等价
也可以通过 p2 二级间接访问 变量 x,即 **p2 等价于 *p1 等价于 x
对于二级间接访问 **p2,c++内部处理是这样的:
- 先从变量属性表中取得 指针变量 p2 的地址;
- 通过地址 找到指针变量 p2,取出其存储的内容 指针变量 p1 的地址,即2000;
- 通过地址2000 找到指针变量 p1,取出其存储的内容 变量 m 的地址,即1000;
- 通过地址1000 找到变量x,访问其存储的内容,即3。
(以上就是我这次对 & 和 * 的一些浅薄的见解和简单的笔记,如有错误,还望各位大佬多多指教~~)