C语言指针学多了,你为什么会觉得晕?
对于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是一家了。
这篇文章主要是分析指针学习让你头晕的原因,文字表述可能并不严谨,请见谅!
C语言指针学多了,你为什么会觉得晕?的更多相关文章
- (转载)c语言指针学习
前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水, ...
- C语言指针的陷阱
C语言指针的陷阱 分类: C/Cpp 转自:http://blog.csdn.net/porscheyin/article/details/3461670 “C语言诡异离奇,陷阱重重,却获得了巨大 ...
- c语言指针学习【转】
前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水, ...
- 关于C语言指针的一些新认识(1)
Technorati 标签: 指针,数组,汇编,C语言 前言 指针是C语言的精华,但我对它一直有种敬而远之的感觉,因为一个不小心就可能让你的程序陷入莫名其妙的麻烦之中.所以,在处理字符串时,我总是能用 ...
- C语言指针专题——序
看到好多的C语言初学者学到指针时,都觉得指针怎么那么难啊!我也想起了我当时学习指针时遇到的困难,确实很难!到底是教程写的不好呢,还是老师教的不好呢?我觉得都有. 网上搜索指针讲解的资料很多,我也看了不 ...
- C语言指针的一些用法
指针是C语言的灵魂,精华之所在.指针强大而危险,用得好是一大利器,用得不好是一大潜在危害.正是指针具有强大而又危险的特性,加上指针比较难,很多人用的不好,所以越是封装程度高的语言,越是没有指针的&qu ...
- C语言入门---第九章 C语言指针
没学指针就是没学C语言! 指针是C语言的精华,也是C语言的难点. 所谓指针,也就是内存的地址,所谓指针变量,也就是保存了内存地址的变量.不过人们往往不会区分两者的概念,而是混淆在一起使用. ===== ...
- C语言指针转换为intptr_t类型
1.前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量.由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针.感觉很奇怪,为何要将一个指针 ...
- [转]C语言指针学习经验总结浅谈
指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...
随机推荐
- 图像滤镜艺术---挤压(Pinch)滤镜
原文:图像滤镜艺术---挤压(Pinch)滤镜 Pinch滤镜 Pinch滤镜是通过坐标变换来实现以某个点(cenX,cenY)为中心,某个半径R内图像向其挤压变形的效果.实现这个滤镜的算法很多,主要 ...
- SQL Server 2016新特性:DROP IF EXISTS
原文:SQL Server 2016新特性:DROP IF EXISTS 在我们写T-SQL要删除某个对象(表.存储过程等)时,一般会习惯先用IF语句判断该对象是否存在,然后DROP,比如: 旧 ...
- MEF、MAF和Unity的区别
在刚学习MEF时,经常会问一个问题,那就是MEF和MAF这样的插件框架.和Unity这样的IoC框架到底有什么区别.MEF与MAF(Managed Addin Framework)最大不同在于:前者关 ...
- Android零基础入门第38节:初识Adapter
原文:Android零基础入门第38节:初识Adapter 在上一节一起了解了ListView的简单使用,那么本节继续来学习与ListView有着千丝万缕的Adapter. 一.了解MVC模式 在开始 ...
- Java虚拟机性能监控与调优实战
From: https://c.m.163.com/news/a/D7B0C6Q40511PFUO.html?spss=newsapp&fromhistory=1 Java虚拟机性能监控与调 ...
- 修改GitHub上项目语言显示
问题 最近将自己以Scala为主语言写的博客放到github上了.由于使用了富文本编辑器.jQuery.Bootstrap等第三方插件,导致js.css等代码远远超过你自己写的代码. 于是也就成这样了 ...
- Sailfish OS 2.1.0 发布,带来重大的架构变化
Sailfish OS 2.1.0 Iijoki 发布了. Iijoki通过引入Qt 5.6 UI框架.BlueZ 5 蓝牙堆栈和 64 位架构的基本实现,为Sailfish操作系统带来了重大的架构变 ...
- Qt for Android之Hello World
Qt for Android (Hello World APK 创建)Qt是跨平台的,如桌面.移动.嵌入式平台.Qt for Android可以在Android v2.3.3 (API level 1 ...
- 推荐一些C#相关的网站、资源和书籍 (转载自http://blog.csdn.net/chinacsharper/article/details/17514923)
一.网站 1.http://msdn.microsoft.com/zh-CN/ 微软的官方网站,C#程序员必去的地方.那里有API开发文档,还有各种代码.资源下载. 2.http://social.m ...
- Angular4初学
[1].在学习Angular4之前,首先要了解一些typescript的知识. 以下是我的总结:https://gitee.com/FangXiaoQi123/angularJSCeShi/blob/ ...