当前位置:  编程技术>c/c++/嵌入式

C语言的指针类型详细解析

    来源: 互联网  发布时间:2014-10-20

    本文导语:  指针存储了内存的地址,同时指针是有类型的,如int*,float*,那么,一个自然的猜想就是指针变量应该存储这两方面的信息:地址和指针类型,比如,就像下面的结构体: 代码如下:struct pointer{    long address;    int type;}举个...

指针存储了内存的地址,同时指针是有类型的,如int*,float*,那么,一个自然的猜想就是指针变量应该存储这两方面的信息:地址和指针类型,比如,就像下面的结构体:

代码如下:

struct pointer{
    long address;
    int type;
}

举个例子:打印sizeof(int*),值为4,可见4字节是存储内存地址用的,反过来就说明指针并没有存储类型信息的地方,那么指针的类型信息存放在哪儿呢?
下面剖析一段简单的代码。
代码如下:

// ma.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
char gi;
char *pi;

void main()
{
pi=&gi;
*pi=12;
}


反汇编结果:
代码如下:

pi=&gi;
0041137E C7 05 78 71 41 00 7C 71 41 00 mov         dword ptr [pi (417178h)],offset gi (41717Ch)
*pi=12;
00411388 A1 78 71 41 00   mov         eax,dword ptr [pi (417178h)]
0041138D C6 00 0C         mov         byte ptr [eax],0Ch
}

可见byte就说明了指针类型的信息。
总结:C语言的指针类型包括两方面的信息:一是地址,存放在指针变量中;二是类型信息,关乎于读写的长度,没有存储在指针变量中,位于用该指针读写时的mov指令中,不同的读写长度对应的mov指令不同。

另外:在指针强制转换时,也是这个原理。就是指针强制转换的影响不是在转换的时候发生,而是在用转换后的身份去访问内存时体现到了指令中。

那么指针在什么情况下转换是安全的呢?就是看用这个转换后的身份去访问内存是否安全。简要的说有以下原则:如果转换后指针指向的数据类型大小小于原数据类型大小,那么用该转换后的指针访问就不会越过原数据的内存,是安全的,否则危险,要越界。


    
 
 

您可能感兴趣的文章:

  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • C语言指针问题?
  • C语言中常量指针与指针常量区别浅析
  • C语言:指针问题求救~
  • 一个c语言指针问题
  • C语言指针学习经验总结浅谈
  • 关于c语言指针的两处小tip分享
  • C语言数组指针的小例子
  • C语言入门之指针用法教程
  • C语言创建链表错误之通过指针参数申请动态内存实例分析
  • 基于C语言中野指针的深入解析
  • C语言安全之数组长度与指针实例解析
  • 新手提问c语言指针
  • c语言指针之二级指针示例
  • 解析C语言中空指针、空指针常量、NULL & 0的详解
  • 关于C语言指针赋值的问题详解
  • 深入理解C语言 static、extern与指针函数
  • 深入分析C语言中结构体指针的定义与引用详解
  • C语言指针的长度和类型深入分析
  • C语言中函数与指针的应用总结
  • C语言二维条形码解析库 libqrencode
  • C语言的XML解析器 iksemel
  • 用C语言如何组装和解析XML报文???
  • C 语言的 JSON 解析器 BeneJSON
  • 表达式语言解析器 Commons EL
  • C语言的异步DNS解析库 c-ares
  • C语言DNS解析器 dns.c
  • C语言的HTML解析库 libhtml
  • 请问脚本语言 解析器的工作原理?
  • 在做FTP服务端,请问哪位有解析LIST命令的C语言代码?
  • 纯C语言实现的HTML5解析库 Gumbo
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 深入理解:Java是类型安全的语言,而C++是非类型安全的语言
  • C语言指针学习经验总结浅谈 iis7站长之家
  • 菜鸟问题:如何了解系统关于某个C语言变量类型是怎样定义的?
  • 弱类型动态语言 Io
  • 如何获得语言类型?
  • 如何在C语言的宏中使用类型关键字
  • 请问在UNIX系统下C语言中的数据类型转换的问题
  • 请问:ORACLE中的数据取出来后,需不需要进行一定的转换才能变为C语言的数据类型啊?
  • Linux 的C语言下 有没有系统时间的变量类型?
  • linux下c语言字符串数据类型的问题!
  • C语言中自动隐式转换与类型强制转换实例分析
  • Linux下的C语言字符串和字符有几种类型?和Windows下区别是不是很大?
  • 关于几种 c语言内部数据类型的 字节长度
  • 跨语言类型声明和接口绑定 Djinni
  • c语言中time_t类型是一个长整型,java中的字符串"YYYY-MM-DD HH:MM:SS"怎么转换为这个长整型?
  • 在VC下如果要打开其它语言命名的文件读行二进制读取可以用TCHAR来定义文件名,读写函数他自己会自动选择,现在要换到LINUX下(UBUNTU)下开发,如果有多种语言命名的文件,我应该用什么类型来存放文件名?
  • C语言变量类型与输出控制用法实例教程
  • Java语言的接口与类型安全
  • C语言小程序 如何判断三角型类型
  • 16种C语言编译警告(Warning)类型的解决方法
  • 2013年7月和2013年8月编程语言排行榜
  • 如何在GTK2.0下实现国际化(语言选择根据自己设置的语言,不用系统的语言)
  • 2017 年热门编程语言排行榜出炉,你的语言上榜没?
  • 求助,在linux下,c语言和汇编语言的接口是什么?
  • 苹果OS X和IOS下最新编程语言swift介绍
  • C语言中间语言 CIL
  • c语言判断某一年是否为闰年的各种实现程序代码
  • 最近学JSP,苦于HTML语言和JAVA语言太差,请教推荐几本书,thanks.
  • PHP编程语言介绍及安装测试方法
  • 动态编程语言 LIME编程语言
  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3