对于C语言中的指针概念,如果我告诉你,它是一个地址变量,你听了一头雾水,“地址?啥意思?”见你不理解,我说的详细点“指针变量跟其他变量一样,存储的是一个地址”。你想了想,“跟其他变量一样?其他变量存放的是数值,变量有地址....指针变量存放的是地址,地址里有个值.....”你又晕掉了!没办法,我找了专业教材,找到教材上对指针的定义“指针是一个变量,存储的另一个变量的地址,也就是另一个变量所在的内存位置的首地址。”你转了转大眼睛,仍然一头懵逼!

好吧,看来传统的解释会让你一直晕下去,那我不解释了,本篇文章我不解释什么叫指针了,我就重点说下为什么指针会让你晕,指出让你晕的根本原因,也许你知道了就不晕了呢?

我们先来看一个很简单的变量定义:

int a = 1;

a是一个整型变量,它的值是1,对于这么简单的一个变量,你铁定地绝对地一定地不会晕,a就是1,1就是a嘛,简单、清晰、明了!

画个图来看下:

好了,下面我们再定义一个指针变量p:

#include "stdio.h"

#include "stdlib.h"

int main()

{

int *p = NULL;

p = (int *) malloc (sizeof(int)); //为指针变量p申请一段内存地址

printf("指针p的值是%x\n", p);

*p = 2;//上述申请的内存地址存放的数值是2

printf("指针p指向的值是%d\n", *p);

free(p);

p = NULL;

return 0;

}  

我们先看下运行结果:

p的值是“380fe0”,指向的值是2。你看到这个后,你会想“刚才变量a和1好理解,a就是1,1就是a。现在有p,380fe0,2三个东东,p就是380fe0?那p跟2是啥关系?380fe0跟2又是啥关系?对了,好像还有个*p这个东东,又是什么关系?完了,我晕了!!”现在我可以指出,在理论上,你指针学多了晕的根本原因就在如下两点:

1.有四个东西:p,*p,380fe0和2,比刚才的a和1硬生生多了两个东西,使得你大脑思考时多了两个需要思考的对象,增加了你大脑思考的负担;

2.这四个东西:p,*p,380fe0和2中,只有p、*p、2会被程序代码所使用,380fe0一般用不到,但是你又必须时时刻刻记着这个380fe0,又再次增加你大脑思考的负担;

好了,我再用一张图来形象地解释你会晕的原因:

与a和1的那张图对比,形象上来说你指针学多了晕的根本原因又在如下3点:

1.你传统思维是a就是1,1就是a。但在指针变量来看,p就不是2,2也不是p了。p是啥?p就是380fe0,380fe0就是p。注意,你的传统思维开始第一次被颠覆,接着看:

2.那谁就是2,2就是谁呢?答案就在于*p就是2,2就是*p。出现了*p,你的传统思维第二次被颠覆,哈哈;

3.那p和*p啥关系?两者长的好像啊,就是多了一个*的区别。你的传统思维开始第三次被颠覆。到这里,你基本上已经晕了;

那么,在学指针,用指针时,如何做到不晕呢?除了好好多学习多思考外,我教你三招:

1.看到指针变量时,立即抛弃你的a就是1,1就是a的传统思维,开始想到p,*p,380fe0和2这四个东东,不然你会思考的很痛苦;

2.牢记p与380fe0是一家,*p与2是一家;

3.记住p与2是远方亲戚,p与2要通过*p来联系;*p与380fe0是远方亲戚,*p脱掉*就和380fe0是一家了。

这篇文章主要是分析指针学习让你头晕的原因,文字表述可能并不严谨,请见谅!

最新文章

  1. Centos网络配置
  2. Windows自带压缩解压工具
  3. 在Ubuntu14.04下安装vsftp服务器
  4. easyui中tree使用simpleData的形式加载数据
  5. box-shadow使用指南
  6. 未能加载文件或程序集“System.WEB.DataVisualization, Version=3.5.0.0, Culture=neutral
  7. Oracle 执行计划说明
  8. 第一个deeplearning4jproject跑起
  9. 理解O/R Mapping
  10. PHP上传文件出现文件名被截掉第一个字符的问题
  11. 【转】Android UI系列-----时间、日期、Toasts和进度条Dialog
  12. Centos根据系统VPS安装SendMail组件使WordPress支持E-mail
  13. 细菌(disease)
  14. Android 仿百合网超火爆社交app首页滑动效果
  15. ssm上传图片
  16. sql的连接查询
  17. PNG,JPEG,BMP,JIF图片格式详解及其对比
  18. 数据库中,表一sum得出一个值,赋给表二的某个字段,为null
  19. Hadoop的RPC工作原理
  20. matplot读取文本文件画图

热门文章

  1. comtextMenu 如何正确的响应MouseLeave事件
  2. mysql的命令行安装,忘记密码,密码重置问题
  3. 零元学Expression Blend 4 Chapter 22 以实作案例学习Frame及HyperlinkButton
  4. Linux之文件的压缩与解压缩
  5. Voovan 是一个高性能异步网络框架和 HTTP(Java)
  6. Google C++测试框架系列高级篇:第二章 让GTest学习打印自定义对象
  7. TopFreeTheme精选免费模板【20130626】
  8. 警惕SAP项目被“中间商赚差价”
  9. KNN算法——分类部分
  10. spring源码解析之IOC容器(四)——属性注入