文档章节

读征服C指针有感

ikel
 ikel
发布于 2013/11/10 22:43
字数 778
阅读 346
收藏 7
点赞 0
评论 3

前提条件:32位环境

1. 指针就是地址。指针++的长度等于该类型的长度?我一直以为指针就是占四个字节的,是的,只是在使用指针做++运算时,地址的值会增加当前指针所指向数据类型的长度。指针本身会占用内存中4个字符的地址(64位系统会分配8个字符),而这4个字符的长度里面又存了指针所指向数据的地址值,所以指针可以指向复杂的数据类型。指针不能直接给值,而要给一个有值的变量或对象,因为里面要存地址,不存具体的数据。

2.空指针的地址是0x00000000?大多数环境下是这样,特殊的硬件环境可能不是。NULL只是个宏定义,一般是0.但也会是(void *)0。所以字符串的结尾不能用NULL,可能会报警告。

3.用printf看到的地址是操作系统分配的虚拟内存地址,而不是真实的物理内存地址。这样可以防止一个程序可以修改其他程序占用的内存地址。而且测试发现,同一个控制台程序,启动2次,里面变量可以显示一样的地址,但一个程序对值的修改不影响另外一个程序中的值。说明操作系统对虚拟内存中地址一样的却映射了物理内存的不同地址。

4.内存碎片化。在c中使用malloc,realloc函数向操作系统申请内存。realloc(void *p, size_t)中会把原占有内存释放掉,重新申请一块,然后把p对应的值拷贝过来。如果p=NULL,则跟malloc等效。在不断发出申请、free的过程中,是否会有很多碎片?如果能看到malloc的源代码会发现,malloc会先向操作系统申请一个大块的内存空间,然后切割成多个小块,按申请的大小切给各个调用malloc的对象,如果释放了,相邻的空闲空间会合并成一块空间。在用free之前,malloc分配的地址总是变大的,在有过free之后,malloc后的地址也许就在已用的之间。它会在最小的地址(链表的头)开始往后找空闲的能切出要求大小的空间。如果该快大的内存空间不够了,会再向操作系统申请,把新的作为原链表的最后一个数据成员。

5.内存对齐。PC机都会采用4字节对齐方式。所以结构体

typedef struct {

      int         int1;

      double   double1;

      char      char1;

      doubel  double2;

} hugo;

的大小是24.如果按照结构体的顺序把数据写入文本,遇到按8位字节对齐读取的机器的时候,就会发生错误。同时,intel,amd处理器的芯片是采用小端,就是假如4个字节的数据0x12345678存的时候是78  56 34 12.

© 著作权归作者所有

共有 人打赏支持
ikel
粉丝 4
博文 22
码字总数 9888
作品 0
浦东
程序员
加载中

评论(3)

ikel
ikel

引用来自“roylieu”的评论

指针就是地址加步长(类型)

地址加步长(类型)岂不是要超过4个字符了(32位机器中)
roylieu
roylieu
指针就是地址加步长(类型)
哆啦比猫
哆啦比猫
指针只记录地址,不记录额外信息(但是编译器会记录);指针可以直接给值,因为指针就是一 int (机器字长定点数)。地址也是数据。
VR体验有多真?有人玩着玩着摔倒了

玩VR游戏之前,还得确保活动范围内的安全。 近期,《星际迷航》演员乔治·武井(George Takei)在Facebook帐号上分享的一段视频显示,一名男子试图在Oculus头戴设备中征服一座虚拟山峰,但最...

行者武松
03/01
0
0
云风开发笔记 (5) : 场景服务及避免读写锁

这周我开始做场景模块。因为所有 PC 在 server 端采用独立的 agent 的方式工作。他们分离开,就需要有一个模块来沟通他们。在一期目标中,就是一个简单的场景服务。用来同步每个 agent 看到的...

亚历山大痒
2013/03/17
0
0
备忘:fopen()和fclose()的用法

open()和fclose()的用法 1.fopen()函数的用法 fopen函数用于打开文件, 其调用格式为: FILE fopen(char filename, *type); fopen()函数中第一个形式参数表示文件名, 可以包含路径和文件名两部...

berryz2007
2010/12/12
0
0
如果程序员是士兵,那编程语言会是什么样的武器?

如果程序员是士兵,那 C、C++、汇编、PHP、Perl、Python、JavaScript、Java、Scala、ActionScript、Objective-C、Swift、Go、Ruby 等编程语言 会是什么样的武器呢?本文摘编自 Chandra Penk...

两味真火
2016/10/01
4.1K
15
oracle体系结构学习笔记《一》

体系结构和备份恢复原理 1 oracle database 最重要的是online redo log 类比法 controlfile :公司高管 datafile :生产车间 online redo log:财务处 注释: system表空间是第一生产车间; ...

长平狐
2012/09/19
37
0
C语言scanf函数详细解释

函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类...

晨曦之光
2012/03/09
46K
1
C&C++文件操作

  流式文件操作   这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下以下是引用片段:   typedef struct {   int level; / fill/empty level of buffer /   unsig...

微一
2013/01/04
369
2
求教,新手如何来学习阅读一些优秀的开源C代码

@中山野鬼 你好,想跟你请教个问题:本人学习编程的目的很多是出于解决客户端应用的需求,以及日常工作的自动化等,因此学的都是些c#,python,shell,perl之类的玩意。现在工作需求需要阅读些...

cylinux
2015/02/10
606
1
c语言操作文件

http://www.cnblogs.com/whiteyun/archive/2009/08/08/1541822.html 文件使用方式        意 义 “rt”      只读打开一个文本文件,只允许读数据 “wt”      只写打开或...

zhangdengbo
2014/03/19
0
0
《Beginning Linux Programming》读书笔记(四)

1, 读写空指针 先看第一种情况,printf试图访问空指针,以打印出字符串,而sprintf试图向空指针写入字符串,这时,linux会在GNU C函数库的帮助下,允许读空指针,但不允许写空指针。 复制代...

嗯哼9925
01/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring-@RequestBody

@RequestMapping("/login")    public void login(@RequestBody String userName,@RequestBody String pwd){      System.out.println(userName+" :"+pwd);    }    ......

说回答
5分钟前
0
0
Redis安装

大家可以通过该链接获取安装详情(这是一个Word文档,支持下载): http://note.youdao.com/noteshare?id=7a327ed6c58fb2037ba537e58ecf7510&sub=480DB8EF349747C3983B73AE94D45BB1 其他参考...

一梦心草
5分钟前
0
0
MySQL按天,按周,按月,按时间段统计【转载】

https://blog.csdn.net/qq_28056641/article/details/78306870 select DATE_FORMAT(create_time,'%Y%m%d') days,count(caseid) count from tc_case group by days; select DATE_FORMAT(creat......

李道福
7分钟前
0
0
浅谈parallelStream

parallelStream是什么,它是一个集合的并发处理流.其作用是把一个集合中的数据分片,进行一个多线程的处理,增快运行速度. 比如说这样一段代码 private Set<SysRole> sysRoles;private Set<St...

算法之名
9分钟前
2
0
器者,道之所载

形而上者谓之道,形而下者谓之器,化而裁之谓之变;推而行之谓之通,举而措之天下之民,谓之事业。—— 《道德经》

了凡川
10分钟前
0
0
C#命名规范中文版/C#编码规范中文版

最新文档地址https://github.com/hiramtan/CSharpNamingGuidelines_Chinese C#命名规范中文版/C#编码规范中文版 示例 /*****************************************************************......

海贝Hibey
12分钟前
0
0
刚从eclipse转到Intellij IDEA,分享一些配置经验

刚从eclipse转到Intellij IDEA,分享一些配置经验,IntelliJ IDEA作为最好的Java开发工具,在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、 创新的GUI设计等...

舒文joven
13分钟前
1
0
lombok 引入后,测试类始终找不到get,set方法。

开发环境为idea,jdk1.7,maven3.5. 网上直接搜出来的方法有: 1、在setting里安装lombok的plugins; 2、如下图,勾选enable annocation processing选项 3、升级maven plugins插件 我尝试了以...

Kidult
19分钟前
0
0
Duang,HUAWEI DevEco IDE全面升级啦

想感受全新UI带来的视觉及交互体验、 HiKey970开发板调测、 HiAI API推荐和收藏、 深度AI模型分析等新功能, 体验高清晰度和流畅度的远程AI真机调测吗? 全新的UI设计 采用最优秀的视觉及交互...

华为终端开放实验室
27分钟前
1
0
阻止事件冒泡,阻止默认事件

1.event.stopPropagation()方法 这是阻止事件的冒泡方法,不让事件向documen上蔓延,但是默认事件任然会执行,当你掉用这个方法的时候,如果点击一个连接,这个连接仍然会被打开, 2.event....

闫亚亚
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部