C 指针的理解

来源:互联网 发布:美亚海淘宝宝用品清单 编辑:程序博客网 时间:2024/05/17 03:00

  想想自己曾经学习C语言时,初次见到指针、地址,只能死记硬背,经过一段时间的软磨硬泡,终于有所收获,在此记录自己对C语言中地址、指针的理解。
  推荐对C语言有一定理解的程序员阅读。
  学习过C语言的程序员们,一定都知道“指针就是地址”的经典描述,到底如何理解指针就是地址。

1. 内存长成啥样?
  物理内存条由连续排列芯片组构成,在计算机中内存模型也被抽象为一组连续的存储空间,每个空间都能够存储若干字节的数据,每一块存储空间也有一个特定的序号,从0到N。
备注:为了便于理解,此处,将内存存储空间横向排列(实际横纵排列的意义相同)。

0000 0001 0002 0003 … 00FF 0100 0101 …. 01FF ….

2. 地址是什么?
变量的地址指的实际就是保存变量数据的内存节点序号。

    int a = 10;     //int 占用4个字节    printf("&a = %08X\n", &a);  //打印a的地址 008DF70C

  非常简单的一段代码,打印变量a的地址,008DF70C就是内存地址,也是存放数据的起始位置(内存序号),数值10就保存在008DF70C~008DF70F(共4个字节的内存空间),从下图就能直观的看出变量和地址的关系。
调试查看a的地址
图中(蓝色)选中部分的数值0000000a,就是a的数值10的十六进制表示。前面7个0是因为存储的数值过小,数据高位被0填充。


3. 指针是什么?为什么说指针就是地址?两者之间的关系是什么?
  指针也是变量,不过是与普通的数据类型(int, long, float, double等)不同的变量,因为指针的值记录的是相同类型变量的地址(内存序号)。

    int a = 10;     //int 占用4个字节    printf("&a = %08X\n", &a);   //打印a的地址005DF740    int *p = &a;    //int*类型的指针p指向int类型变量a的地址    printf("*p = %08X\n", *p);  //打印指针p指向的值,10    printf("p = %08X\n", p);    //打印指针p指向的地址,005DF740    printf("&p = %08X\n", &p);  //打印p的地址,005DF734

  代码中定义int类型指针p,初始化指向变量a的地址,并打印p指向地址的值,p的值,以及p的地址。结合下图,可以看出,p的值与a的地址相同(废话,初始化代码都已经知道了 v_v),通过下图可以看出p和&a是同一个地址空间005DF740,记录的值是10。
变量a的地址与p的值
  
  既然说指针也是变量,指针的地址记录的是什么呢?一起接着看下面这张截图。
指针p的地址
  图中,查看p的地址(&p),在005DF734~005DF737的地址(内存序号)中保留的数值经过高低位转换(40 F7 5D 00 -> 005DF740),正是变量a的地址。由此可见,指针是记录内存地址的“特殊”变量
  指针就是地址,其实是指平时使用指针过程中,指针变量记录的就是地址,如例子中的int指针p,直接打印的结果就是指向a的地址,如果想获得指向地址的值,需要使用*。
  指针指向一块保存变量的地址。

仔细看图的读者会发现,指针存储空间也是4个字节。可以用sizeof()打印指针的长度确认一下,等长的存储空间是任意转换指针类型的基础。

  每个人对C指针的理解都有差别,我希望我的理解能对初学新手带来一点点帮助。文中有很多漏洞和不足,望大家提出。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 没感冒喉咙有痰怎么办 宝宝喂不进去药怎么办 新生儿只放屁不拉大便怎么办 新生儿腹胀不拉大便怎么办 8月宝宝咳嗽有痰怎么办 2个月婴儿惊吓怎么办 吃了米粉不拉屎怎么办 奇异果奶昔苦了怎么办 8个月宝宝偏瘦怎么办 一岁宝宝螺旋腿怎么办 七个月宝宝晚上咳嗽厉害怎么办 孕7个月感冒咳嗽怎么办 4个月婴儿肺炎怎么办 宝宝吃胡萝卜泥拉肚子怎么办 宝宝吃土豆泥不消化怎么办 五个月宝宝奶睡怎么办 橘子和牛奶一起吃了怎么办 半岁宝宝不喝水怎么办 一岁宝宝总是便秘怎么办 1岁的宝宝不喝水怎么办 两月宝宝不喝水怎么办 破壁机打出的果汁很浓稠怎么办 榨的果汁不甜怎么办 11个月宝宝吃盐怎么办 1岁半宝宝长牙慢怎么办 小孩里面的牙黑怎么办 7个半月宝宝便秘怎么办 2个月婴幼儿便秘怎么办 3个月宝宝不消化怎么办 一天大便二三次不消化怎么办 不消化没胃口几天不大便怎么办? 两个月的宝宝拉绿屎怎么办 肠胃不好消化功能差怎么办 2岁宝宝消化不好怎么办 5天新生儿不拉大便怎么办 七个月宝宝一周不拉屎怎么办 七个月的宝宝消化不良怎么办 七个月宝宝消化不良拉肚子怎么办 宝宝六个月了便秘怎么办 宝宝拉水酸臭味怎么办 50天婴儿不拉屎怎么办