c语言指针灵活性管窥

最近看到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>

void
f(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);
}

int
main(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]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

近100个Spring/SpringBoot常用注解汇总!

作者 | Guide来源 | JavaGuide&#xff08;微信公众号&#xff09;毫不夸张地说&#xff0c;这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景。对于每一个注解我都说了具体用法&#xff0c;掌握搞懂&#xff0c;使用 SpringBoot 来开发项…

虚拟化之vmware-vsphere (web) client

两种客户端 vsphere client 配置》软件》高级设置里的变量 uservars.supressshellwarning1 vsphere web client 安装完vSphere Web Client后&#xff0c;在浏览器地址栏输入https://localhost:<9443 或者你选择的其他端口>/admin-app/就可以访问vSphere Web Client管理工…

用贪婪算法解决背包问题_解决主要算法问题的贪婪策略

用贪婪算法解决背包问题Introduction: 介绍&#xff1a; Lets start the discussion with an example that will help to understand the greedy technique. If we think about playing chess, when we make a move we think about the consequences of the move in future st…

HashMap 的 7 种遍历方式与性能分析!(强烈推荐)

这是我的第 56 篇原创文章随着 JDK 1.8 Streams API 的发布&#xff0c;使得 HashMap 拥有了更多的遍历的方式&#xff0c;但应该选择那种遍历方式&#xff1f;反而成了一个问题。本文先从 HashMap 的遍历方法讲起&#xff0c;然后再从性能、原理以及安全性等方面&#xff0c;来…

BBcode 相关资源索引

VeryCD社区BBCode使用指南 BBcode Reference BBcodewikipedia

Why is HttpContext.Current null after await?

今天在对项目代码进行异步化改进的时候&#xff0c;遇到一个奇怪的问题&#xff08;莫笑&#xff0c;以前没遇过&#xff09;&#xff0c;正如标题一样&#xff0c;HttpContext.Current 在 await 异步执行之后&#xff0c;就会变为 null。 演示代码&#xff1a; public async T…

c ++产生不同的随机数_C ++程序生成随机密码

c 产生不同的随机数Problem Statement: 问题陈述&#xff1a; Write a menu driven program to generate password randomly 编写菜单驱动程序以随机​​生成密码 constraint: 约束&#xff1a; password should consist of 密码应包含 lowercase Alphabet - a to zUpperC…

如何选择c语言学习书籍

C语言作为一个简洁精巧的语言&#xff0c;在计算机业中仍有非常广泛的应用。而在最近的编程语言流行度排名 中&#xff0c;C语言仍然位居第二的宝座。 通常在学习一门编程语言之前我们都会有一定的缘由&#xff1a;可能是为了应付某项专业考试&#xff0c;也可能是提高自己的专…

WEB平台架构之:LAMP(Linux+Apache+MySQL+PHP)

WEB平台架构之&#xff1a;LAMP(LinuxApacheMySQLPHP) 从业界来看&#xff0c;最主流的web平台架构就当属LAMP了。LAMP架构可以说是一切web平台的基础架构&#xff0c;所有一切的所谓大型架构无非就是通过一些负载均衡技术&#xff0c;集群技术&#xff0c;缓存技术等结合LAMP…

numpy zeros矩阵_零矩阵使用numpy.zeros()| 使用Python的线性代数

numpy zeros矩阵Zeros Matrix - When all the entries of a matrix are one, then it is called a zeros matrix. It may be of any dimension (MxN). 零矩阵 -当矩阵的所有条目均为1时&#xff0c;则称为零矩阵。 它可以是任何尺寸( MxN )。 Properties: 特性&#xff1a; T…

图解TCP三次握手和四次挥手!(简单易懂)

哈喽&#xff1a;亲爱的小伙伴&#xff0c;首先祝大家五一快乐~本来打算节日 happy 一下就不发文了&#xff0c;但想到有些小伙伴可能因为疫情的原因没出去玩&#xff0c;或者劳逸结合偶尔刷刷公众号&#xff0c;所以今天就诈尸更新一篇干货&#xff0c;给大家解解闷~前言不管面…

《c程序设计语言》练习1-12

c程序设计语言练习1-12&#xff1a;编写一个程序&#xff0c;以每行一个单词的形式打印其输入。 此处单词是指除空格&#xff0c;TAB键&#xff0c;换行字符和文件结束符号&#xff08;EOF&#xff09;之外的其他字符。 我的代码如下&#xff1a; 而《the c answer book》中的代…

如何在Java中对Collection对象进行排序?

排序集合的对象 (Sorting objects of the Collection) This concept is related to sorting and here we will see how to sort objects on the Collection? 这个概念与排序有关&#xff0c;在这里我们将看到如何对Collection上的对象进行排序&#xff1f; In java, we have u…

CFD分析过程(CFD Analysis Process)

2019独角兽企业重金招聘Python工程师标准>>> CFD分析过程 进行CFD分析的一般过程如下所示&#xff1a; 1、将流动问题表示为表达式 2、建立几何与流域的模型 3、设置边界条件和初始条件 4、生成网格 5、设置求解策略 6、设置输入参数与文件 7、进行仿真 8、监视仿真…

《数据结构与算法分析-C语言描述》习题2.6

《数据结构与算法分析-C语言描述》&#xff08;[urlhttp://users.cis.fiu.edu/~weiss/#dsaac2e]Data Structures and Algorithm Analysis in C[/url])习题2.6 该题要求计算几个循环的复杂度&#xff0c;并用程序计算出程序的执行时间。我在linux下的c程序如下&#xff1a;/* ex…

Redis 6.0 正式版终于发布了!除了多线程还有什么新功能?

这是我的第 56 篇原创文章Redis 6.0.1 于 2020 年 5 月 2 日正式发布了&#xff0c;如 Redis 作者 antirez 所说&#xff0c;这是迄今为止最“企业”化的版本&#xff0c;也是有史以来改动最大的一个 Redis 版本&#xff0c;同时也是参与开发人数最多的一个版本。所以在使用此版…

在Java中从字符串转换为双精度

Given a string value and we have to convert it into a double. 给定一个字符串值&#xff0c;我们必须将其转换为双精度型。 Java conversion from String to Double Java从String转换为Double To convert a String to Double, we can use the following methods of Doubl…

如何优雅地「蜗居」?

如果我们把「蜗居」理解为小户型、小空间居住&#xff0c;包括合租、大开间等&#xff0c;如何才能让「蜗居」丝毫不尴尬&#xff0c;所谓「优雅」&#xff0c;就是排除客观限制&#xff0c;最大限度的提升居住品质。王珦&#xff0c;室内设计师&#xff0c;文字编辑 蜗居要看“…

计算程序的执行时间

在windows下计算一段程序的执行时间&#xff0c;有以下方法&#xff1a; &#xff08;1&#xff09;&#xff1a;使用[urlhttp://msdn.microsoft.com/en-us/library/4e2ess30%28VS.71%29.aspx]clock()[/url]函数&#xff08;需包含头文件time.h) 我的c程序代码如下&#xff1a;…

一文带你看完ZooKeeper!

作者 | FrancisQ来源 | JavaGuide“文章很长&#xff0c;先赞后看&#xff0c;养成习惯。❤️ ???? ???? ???? ???? ????”什么是ZooKeeperZooKeeper 由 Yahoo 开发&#xff0c;后来捐赠给了 Apache &#xff0c;现已成为 Apache 顶级项目。ZooKeeper 是一…