23/7/2017  决定夯实基础,回顾指针的知识点,该博文转载于CSDN博主百家晓东,小部分修改,外加编译图引证

正文如下:


以下面的情况说明:

int a = 5;

int* p = &a;


结论:

*p   是指针变量p指向的变量a的存储内容,*p = 5;

p   是指针变量的存储内容,因为p指向a,所以p的存储内容(存储空间的值)就是系统为变量a分配的存储地址;

&p  是对指针变量p进行取地址的操作。


分析:

int a = 5;

int* p = &a;

int* q = p;

【说明】

上面的程序中首先声明了一个int类型的变量a,初始化为5;这个过程为:

变量 存储空间 存储地址
a 5 #ffa1

在初始化时,存储空间存储的是int型的值5,存储地址是由系统自动分配的,同理要声明一个指向a的指针,在初始化的时候赋值给指针变量的值应该是变量a的存储地址,故而有 int* p = &a;

变量 存储空间 存储地址
a 5 #ffa1
p #ffa1 #ffc0

在下面的程序中:

int arr[] = { 1, 2, 5, 7 };

int* parr = arr;

一眼看去为什么arr没有取位运算符呢?因为数组变量名就代表数组的首地址(也就是数组的地址)。

同理,要是声明另外一个int类型的指针变量q:

(1)

int* q = p;

声明了一个int类型的指针变量,并将指针变量p的值赋予q,同样是变量,a = 5,5是变量a的存储空间的值,那么p=?,p等于p存储空间的那个值,即p=#ffa1(a的存储地址);现在将这个值赋给了指针变量q,正如a初始化的过程一样,int a=5的过程,是将5存储在了int类型变量的存储空间之中,初始化指针变量q时,也是将等号右边的值存储在q的存储空间之中,上边的操作的结果如下:

变量 存储空间 存储地址
a 5 #ffa1
p #ffa1 #ffc0
q #ffa1 #ffb1

使得指针变量q指向了变量a。

【说明】

从上面的操作可以看出,p代表的就是指针变量p的存储空间的值,上图中的#ffa1,也是p指向的变量的存储地址。(p的值如上图红色)

(2)

int* q = &p;

声明了一个指针变量q,并对q进行初始化,将指针变量p的存储地址赋给了指针变量q,那么在q的存储空间中存储的就是p的存储地址,上面的操作的结果就是:

变量 存储空间 存储地址
a 5 #ffa1
p #ffa1 #ffc0
q #ffc0 #ffb1

使得指针变量q指向了指针变量p.

【说明】

从上面的操作可以看出,&p代表的是指针变量p的存储地址。(p的值如上图红色)

(3)

int* q = *p;

声明了一个指针变量q,并对其初始化,这一过程的操作如下:

变量 存储空间 存储地址
a 5 #ffa1
p #ffa1 #ffc0
q 5 #ffb1

为指针变量q初始化,q的存储空间中存储的值为5.

【说明】

1.从上面的操作可以看出,是将*p的值赋给了q,p指向变量a,p=#ffa1,而*p的过程就是获得p地址处的存储空间的值,即*(#ffa1)=5,也就是将5赋给了指针变量q,q的存储空间存储的是5;

2.指针变量是指向某一变量的变量,在其存储空间中存储的一般是其他变量的存储地址,上面的初始化过程int* q = *p;是非常危险的,有可能造成程序奔溃。


引证图如下:

  显然,我们需要区分存储地址与存储空间的概念,在这里,p的存储空间是&a,而存储地址是int类型地址里a地址的前一个地址 (FF08与FF0C只差一个二字节)

最新文章

  1. 页内多个input全选不干扰且只用一段代码。
  2. 一、基于hadoop的nginx访问日志分析---解析日志篇
  3. 面试题目——《CC150》数学与概率
  4. 学习SQL的点点滴滴(五)-DELETE小计
  5. explode,split,preg_split性能比较
  6. 2.C#中泛型在方法Method上的实现
  7. Caffe学习系列(14):初识数据可视化
  8. 反射认识_06_ArrayList_HashSet区别
  9. The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
  10. Css定位-定位
  11. setTimeout的时间设为0的问题
  12. js监控视频播放的事件并打印log
  13. Docker镜像与容器命令(转)
  14. python自动化运维:系统基础信息模块
  15. WordCount程序代码解
  16. cocos2dx 开启控制台
  17. hibernate框架学习第三天:对象状态、一级缓存、快照等
  18. aar上传maven库工具
  19. IntelliJ IDEA Ultimate 下载与安装
  20. 基于链表的C语言堆内存检测

热门文章

  1. mysql之ALTER COLUMN、CHANGE COLUMN、MODIFY COLUMN的区别
  2. openFace 人脸识别框架测试
  3. 【html】01_html的介绍
  4. 爱立信开始大规模mesh网络测试
  5. Mybatis(二)参数(Parameters)传递
  6. ios判断手机号是否可用
  7. 如何编写gitignore文件
  8. 用shape画内圆外方,形成一个圆形头像
  9. HDU1284--完全背包
  10. 用phpmailer发送邮件提示SMTP Error: Could not connect to SMTP host解决办法