最近看到mit的[url=http://pdos.csail.mit.edu/6.828/2010/]操作系统课程网站[/url],其[url=http://pdos.csail.mit.edu/6.828/2010/labs/lab1/]实验一[/url]
中练习四(exercise 4)中有一个关于指针使用的代码:

#include <stdio.h>#include <stdlib.h>

voidf(void){    int a[4];    int *b = malloc(16);    int *c;    int i;

    printf("1: a = %p, b = %p, c = %p\n", a, b, c);

    c = a;    for (i = 0; i < 4; i++)      a[i] = 100 + i;    c[0] = 200;    printf("2: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d\n",    a[0], a[1], a[2], a[3]);

    c[1] = 300;    *(c + 2) = 301;    3[c] = 302;    printf("3: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d\n",    a[0], a[1], a[2], a[3]);

    c = c + 1;    *c = 400;    printf("4: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d\n",    a[0], a[1], a[2], a[3]);

    c = (int *) ((char *) c + 1);    *c = 500;    printf("5: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d\n",    a[0], a[1], a[2], a[3]);

    b = (int *) a + 1;    c = (int *) ((char *) a + 1);    printf("6: a = %p, b = %p, c = %p\n", a, b, c);}

intmain(int ac, char **av){    f();    return 0;}

其中比较有趣的是 c = (int *) ((char *) c + 1);*c = 500 这两行程序的执行结果。

在执行这两行代码前,数组a中四个元素的值分别为200,400,301,302,而在intel处理器的32位操作系统上执行完这两行代码后的值则为200,128144,256,302,即这两行代码修改了a[1]和a[2]的值。这是什么原因呢?

200,400,301,302这四个值用十六进制形式表示即为0x000000c8,0x00000190,0x0000012d,0x00000012e。由于intel处理器是little-endian的,即数据的较高位存储在较低内存的位置。所以数组a中数值在内存中二进制表示形式(用十六进制书写)则为 c8 00 00 00 90 01 00 00 2d 01 00 00 2e 01 00 00。在执行上面指针c的两行代码之前,指针c恰好指向90所在的位置。而c = (int*)((char *) c+1);则将本来为指向四个字节数据的指针强制转换成指向一个字节数据的指针,这就导致此后的c+1的执行结果是指向0x01这个内容,之后又将c强制转换成int类型并将其指向的内容赋值为500(0x000001F4)这样原来的01 00 00 2d就被F4 01 00 00所覆盖。所以数组a中数值就变为c8 00 00 00 90 f4 01 00 00 01 00 00 2e 01 00 00。即a中四个元素的值分别为200(0x000000c8),128144(0x0001f490),256(0x00000100),302(0x0000012e).

关于指针的更多讲解见英文教程: [url=http://pweb.netcom.com/~tjensen/ptr/]http://pweb.netcom.com/~tjensen/ptr/[/url]

c语言指针灵活性管窥相关推荐

  1. python动态语言双刃性_动态语言的灵活性是把双刃剑:以 Python 语言为例

    原标题:动态语言的灵活性是把双刃剑:以 Python 语言为例 本文有些零碎,总题来说,包括两个问题:(1)可变对象(最常见的是list dict)被意外修改的问题,(2)对参数(parameter) ...

  2. c语言指针官方解释_C语言中的指针解释了–它们并不像您想象的那么难

    c语言指针官方解释 Pointers are arguably the most difficult feature of C to understand. But, they are one of ...

  3. c语言两个指针变量不可以,2.C语言指针变量

    # 2.C语言指针变量 变量的指针就是变量的地址.存放变量地址的变量是指针变量.即在C语言中,允许用一个变量来存放指针,这种变量称为指针变量.因此,一个指针变量的值就是某个变量的地址或称为某变量的指针 ...

  4. 动态语言的灵活性是把双刃剑 -- 以Python语言为例

    本文有些零碎,总题来说,包括两个问题: (1)可变对象(最常见的是list dict)被意外修改的问题, (2)对参数(parameter)的检查问题. 这两个问题,本质都是因为动态语言(动态类型语言 ...

  5. c语言获取指针分配的字节数,c语言指针知识点总结(共6篇).docx

    c语言指针知识点总结(共6篇) C语言指针教学中的知识点分析与总结 摘要:分析指针的基本概念及指针在数组.函数.字符串.动态存储分配等方面的应用,提出指针教学过程中易混淆概念及注意事项,对初学者深入理 ...

  6. C语言指针数组与数组指针的区别

    C语言指针数组与数组指针的区别 首先,顾名思义 数组指针是一个指针,是指向一个数组的指针,如 int (a*)[5]:这就是一个指向含有5个元素的数组的指针 指针数组是一个数组,它包含的元素全是指针变 ...

  7. simple c语言,C语言——指针(simple).ppt

    C语言--指针(simple) 莆田学院计算机教研室 2003年5月 指 针 绍兴文理学院自动化教研室 2011年4月 本讲主要内容 指针概述 地址· 指针· 指针变量 指针变量作为函数参数 指针与数 ...

  8. c语言115写成16进制,C语言指针问题

    C语言指针问题 來源:互聯網  2009-04-01 16:01:29  評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 問題描述: int a=115,*p;p ...

  9. C语言指针总结大学霸IT达人

    C语言指针总结大学霸IT达人 C语言的指针是C语言区别其它语言的最主要的特定之一.有了指针,C语言就可以抛开所有束缚,直接对内存中的数据进行操作,这样,不单对数据的操作更加快捷,并且可以高效的利用空间 ...

最新文章

  1. Oracle的SQL语句
  2. CMB标量功率谱第一个谱指数跑动项n(1)跑动带来的影响
  3. POJ1151基本的扫描线求面积
  4. CVTE(WEB后台开发)
  5. HBase读写操作流程介绍
  6. 网页版nfc_苹果5大系统升级新特性浓缩汇总!秋季5G版iPhone稳了
  7. tgp饥荒 服务器无响应,tgp饥荒联机版缺少fmod_event.dll文件怎么办?具体解决方法介绍...
  8. python ansys workbench联动_联合ANSYS WORKBENCH和经典界面进行后处理
  9. linux ipset 流量,linux中ipset命令的使用方法详解
  10. spring 的singleton 和prototype的区别和应用场合
  11. 《尚书》全文、注释及译文(1)
  12. 如何实时捕捉社会热点?微博热搜数据监测系统-API接口
  13. 天正的计算机快捷命令大全,新手必看-史上最全CAD快捷键大全
  14. 13个测试网站访问速度的服务网站
  15. ctc系统通信前置服务器,CTC系统包括哪些接口服务器?
  16. js处理null和underfined
  17. 软件测试基础知识bbst,海盗派测试管理: RSTM.PDF
  18. vue根据URL下载文件并重命名
  19. 大数据技术——销售分析系统
  20. mchain r语言_布林带交易策略R语言实现

热门文章

  1. Ubuntu18.04安装cuDNN和Tensorflow的正确姿势
  2. Vscode Todo Tree插件
  3. node+bower+gulp+webpack初见
  4. FreeSWITCH第三方库(视频)的简单介绍(二)
  5. 团队项目—第二阶段第三天
  6. 项目已被os x使用 不能打开-黑苹果之路
  7. C# 数据库连接池 线程安全 单例模式 的实现
  8. PowerDesigner 导入sql脚本到MySQL乱码问题
  9. 关于C语言野指针的问题
  10. (转载)简洁、明晰!数据库设计三大范式应用实例剖析