| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2507 人关注过本帖
标题:C语言指针学多了,你为什么会觉得晕?
只看楼主 加入收藏
kelehaier
Rank: 2
等 级:论坛游民
帖 子:12
专家分:39
注 册:2011-11-13
结帖率:0
收藏
已结贴  问题点数:20 回复次数:13 
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是一家了。

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

欢迎关注我的个人知乎 以及我的博客http://blog.,在上面我写了很多C语言编程时的经验、教训、技巧等,希望多提宝贵的批评意见!


[此贴子已经被作者于2017-1-12 18:57编辑过]

搜索更多相关主题的帖子: 专业 C语言 
2017-01-12 18:55
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:3 
先顶后看~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-12 19:04
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
我来灌水咯

不要说成我们是只会头晕的小混混~

看见你多次说头晕我倒感到头晕了~

不过,上面是玩笑~对新手理解应该会有所帮助的~

我看看能不能无聊帮这贴灌水一下~避免它沉底太快~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-12 19:13
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:3 
我学指针的时候不晕,看你说的我晕。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-01-12 19:24
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
我觉得指针初学者可能还没掌握malloc函数,因为这函数是教材在讲指针和链表时才稍微讲了一下~
可以写成int a=2;int *p=&a;我们教材上基本上是这样举例的~

还有,%x16进制写成%d应该更适合于初学者~毕竟,他们对%x还比较陌生~

[此贴子已经被作者于2017-1-12 19:39编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-12 19:37
ICU
Rank: 4
等 级:业余侠客
威 望:2
帖 子:92
专家分:268
注 册:2017-1-14
收藏
得分:3 
int a=2;//为某段内存(&a)取一个符号化的名字a,然后该内存里放了一个整数2


int *p=&a;//为某段内存(&p)取了一个符号化的名字p,然后该内存里放了另一个内存的位置(&a)
//指针变量在定义时同时初始化是容易晕的原因之一,不妨把这句话分开
//定义和赋值:
//int *p=NULL;
// p=&a;
//这样看上去会不会好一点?
//对于C语言,如果能理解到“任何变量,都是一个符号化的内存位置。直接引用变量名,表示该内存处的值;引用&变量名,表示该内存位置;引用*变量名,表示变量名处存放的另一个内存位置-------的值”,应该就不会晕了
2017-01-15 07:22
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:3 
可以将 int *p=&a; 写成 int* p=&a; 就容易区分 p 与 *p 。
 
2017-01-15 09:21
檀痕哈哈
Rank: 2
等 级:论坛游民
威 望:1
帖 子:12
专家分:10
注 册:2016-10-18
收藏
得分:3 
我来灌水,以免沉底
2017-01-15 11:59
a1294549175
Rank: 1
等 级:新手上路
帖 子:17
专家分:8
注 册:2017-1-12
收藏
得分:3 
看见一个变量p后:
这是个啥??!(类型)
他指了个啥??!
那里有啥??!


2017-01-15 22:44
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
个人觉得能理解malloc()就基本上不会晕。
试试用malloc()分配的空间来处理数据,如:
#include<stdio.h>
#include<stdlib.h>
#define BUFFER_SIZE 1024
main()
{
    void *buf=malloc(BUFFER_SIZE);
        //字符数据
    char *pc = buf;
    *pc = 'A';
    char c1 = *pc;
    pc++;
    *pc = 'B';
    char c2 = *pc;
    printf("c1=%c c2=%c\n", c1,c2);
        //数值数据
    int *pn = buf;
    *pn = 1234;
    int n1 = *pn;
    pn++;
    *pn = 5678;
    int n2 = *pn;
    printf("n1=%d n2=%d\n", n1,n2);
        //字符串数据
    char *ps = buf;
    int i;
    for (i=0; i<10; i++)
        *ps++ = i+'A';
    *ps = '\0';
    char *s=buf;
    printf("s=%s\n", s);
        //指针数据
    char *s1="ABCD";      
    char *s2="EFGH";      
    unsigned long *pp=buf;
    *pp = (unsigned long)s1;
    pp++;
    *pp = (unsigned long)s2;
    unsigned long *ss=buf;
    for (i=1; i<3; i++,ss++)
        printf("s%d=%s\n", i, *ss);
    free(buf);
}
2017-01-16 08:24
快速回复:C语言指针学多了,你为什么会觉得晕?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.053418 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved