dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>C/C++>文章内容
三言两语,妙说《指针》。
来源:本站原创     作者:    

原帖及讨论:

*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国  http://www.bc-cn.net
*/ 作者: hackerjiang    E-mail:hackerjiang@qq.com    QQ:298218699
*/ 时间: 2007-8-6  编程首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------


看了前面仁兄写的“其实就这么简单”,我的手就痒痒了,呵呵。我也来现丑!

首先,因为是“三言两语”,所以那些“是的灵魂”的废话我就不多说了,呵呵。

前言:如果想简单一点,只看彩色即可,黑色一般是扩充,感兴趣的朋友可以看一看。

入正题:

    是什么?——是一种数据类型


    形象的说,大家都知道“邮箱”与“邮箱里的信件”的关系吧!其实就是“地址”(指针)与“地址的内容”(指向的内容)的关系!
    
    
如图:(耐烦的看,不耐烦的跳过)
      
    
     (自己画的,有点粗糙,别怪我。)

图中描述了6个内存单元,它们的编号分别是从1000到1005的6个值,其中编号1000到1005就是相应的内存单元的地址。
数据存放在地址所标识的内存单元中。地址1000到1005多对应的内存单元就是用来存放数据的。

    继续:把内存单元想像成一个个“邮箱”,而内存单元的数据就好比是“邮箱中的信件”,内存单元的编号(地址)就好比是“邮箱的编号”。

    (插一小段,耐烦的看,不耐烦的跳过:如果在程序中定义一个变量,那么编译是系统就会为变量分配一定数量的内存单元。一般系统会为字符型的变量分配1个字节的储存空间,为整型变量分配2个字节的储存空间,浮点型的4个字节)
    
    
总结:1`地址起到一个指向作用。2`地址中还隐含有这个变量的类型信息。

    其实,“指针”就是“地址”。通过“指针”可以找到以它为地址的内存单元。一个变量的地址称为该变量的。

    超级大推理: 
    
——中心:一个变量的地址()也是一个值。
        
→专门用来存放变量地址的变量,称为“变量”。
            
→所以“指针变量”的值是“”(一个变量的地址)。

指针的运算:就地址。中的地址是无符整数。

对于指针变量,允许的主要运算有:1`指针变量的赋值。2`指针与整数之间的加减运算。3`指针之间的比较。4`之间的加减运算。

呵呵```不知写得好不好。如果大家支持,我将写续集,下一集应该是写“与一维数组”吧。呵呵```


附:回帖是一种美德。向回帖的同志致敬!

=================================================================================

精彩回复      作者:福尔摩斯

形象的说,大家都知道“邮箱”与“邮箱里的信件”的关系吧!其实就是“地址”(指针)与“地址的内容”(指向的内容)的关系!

的概念更像一个邮递员!


至于老K说的:不是地址,指什变量的值是一个地址.

解释下:

大家还记得高中数学中一个概念吗:向量(物理称 矢量)

向量有双要素:方向 和 模长

同样, 是 向量 的计算机化(就像是 数组 是 数列 的计算机化一样)

当定义一个 变量 的时候,计算机分配给它空间,用这个空间来存放地址

我们把一个值赋给一个变量,那么这个空间存放的值就是这个变量的值

同样道理,我们把一个地址(无符号整型)赋给一个指针变量,那么这个空间存放的地址就是这个变量的值

而这个概念就是 方向 !

而模长的概念就是 *p !



也许还有人听不明白,我用程序来说明:

我们常常利用 来改变被传递到自定义函数的值(实参),让 改变的值 返回主!

而这个 改变的值 是所指向的 地址上 的 改变的值 (红色部分代码)

而 不是 改变了 的指向 (蓝色部分代码)!


#include<stdio.h>
int main()
{
    int *p,*q,a=1,b=2;
    int change(int *,int *);
    p=&a;q=&b;
    change(p,q);
    printf("%d,%d\n",*p,*q);
    getch();
    return 0;
}
int change(int *x,int *y)
{
    int *z;
    z=x;x=y;y=z;//这里改变了指针的地址,但是结果却没有改变,因为的值是地址,是不会被传递回主的
}


PS:

int change(int *x,int *y)
{
    int z;
    z=*x;*x=*y;*y=z;//它改变了指针所指向的值,但是没有改变的地址!
}


注意蓝色部分如果把 *z 改成 z (或者红色部分 z 改成 *z )都是不可以的!

因为int *z;那么z的空间就是用来存放地址,虽然你也可以认为这样可以传递,但是如果是聪明的编译器就会警告,不聪明的编译器就会报错

所以还是请大家规范书写!

 

 

上一篇:程序测试程序(配合游戏及学习控制管理器使用)   下一篇:很怀旧的游戏--吃豆子
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·C语言学习
·C语言指针
·C语言数组排序小结
·c语言 最简单的推箱子游戏
·c语言 全国计算机编程大赛复赛试
·c语言 全国计算机编程大赛复赛试
·c++ 数组与指针
·C++中的内存管理(new、delete、
·如何用C语言开发DSP嵌入式系统
·如何用C语言开发DSP嵌入式系统
·Linux下C语言编程
·学习arm的话先看哪本书?
  相关文章
·程序测试程序(配合游戏及学习控
·很怀旧的游戏--吃豆子
·游戏及学习控制管理器
·关于制作地图时矩阵的使用(适合
·函数型计算器(VC++6.0,win32 con
·编程证明出世界未解数学问题
·带符号数表示--机器数与真值--原
·最新Dev-c++与Allegor平台的搭建
·关于main()函数
·C语言开发平台的搭建
·编程初学者易犯的毛病
·C语言猜数字游戏重写版
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763