`
haoningabc
  • 浏览: 1476359 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

intptr_t 其实不是指针类型 (转载)

c 
阅读更多
原文地址http://blog.163.com/james_huangjian/blog/static/178049345201261643452479/

eflag寄存器
http://www.cnblogs.com/shenlian/archive/2011/05/22/2053857.html

intptr_t 其实不是指针类型  

2012-07-16 16:34:52|  分类: C++ |字号 订阅
intptr_t 其实不是指针类型
分类: C语言 2012-04-23 17:26 336人阅读 评论(0) 收藏 举报
 最近在看nginx源码,看到有一个类型intptr_t,没有见过,google了一下,有人说是指针类型,但是看nginx源码中对该类型变量的使用,好像不是指针类型。

[cpp] view plaincopy
static ngx_int_t  
 667 ngx_get_options(int argc, char *const *argv)  
 668 {  
 669     u_char     *p;  
 670     ngx_int_t   i;  
 671   
 672     for (i = 1; i < argc; i++) {  
 673   
 674         p = (u_char *) argv[i];  
 675   
 676         if (*p++ != '-') {  
 677             ngx_log_stderr(0, "invalid option: \"%s\"", argv[i]);  
 678             return NGX_ERROR;  
 679         }  
 680   
 681         while (*p) {  
 682   
 683             switch (*p++) {  
 684   
 685             case '?':  
 686             case 'h':  
 687                 ngx_show_version = 1;  
 688                 ngx_show_help = 1;  
 689                 break;  
其中ngx_int_t的定义如下:
[cpp] view plaincopy
78 typedef intptr_t        ngx_int_t;  


于是在linux的头文件中查找这个类型的定义,在/usr/include/stdint.h这个头文件中找到了这个类型的定义(不知道怎么在这里插入图片,所以使用文字):

                           

[cpp] view plaincopy
117 /* Types for `void *' pointers.  */  
118 #if __WORDSIZE == 64  
119 # ifndef __intptr_t_defined  
120 typedef long int        intptr_t;  
121 #  define __intptr_t_defined  
122 # endif  
123 typedef unsigned long int   uintptr_t;  
124 #else  
125 # ifndef __intptr_t_defined  
126 typedef int         intptr_t;  
127 #  define __intptr_t_defined  
128 # endif  
129 typedef unsigned int        uintptr_t;  
130 #endif  

很明显intptr_t不是指针类型,但是上边的一句注释(/* Types for `void *' pointers. */)让人很疑惑。既然不是指针类型,但是为什么说类型是为了“void *”指针?
又查了一下在《深入分析Linux内核源码》中找到了答案,原文描述如下:

尽管在混合不同数据类型时你必须小心, 有时有很好的理由这样做. 一种情况是因为内存存取, 与内核相关时是特殊的. 概念上, 尽管地址是指针, 内存管理常常使用一个无符号的整数类型更好地完成; 内核对待物理内存如同一个大数组, 并且内存地址只是一个数组索引. 进一步地, 一个指针容易解引用; 当直接处理内存存取时, 你几乎从不想以这种方式解引用
分享到:
评论

相关推荐

    用于STM32,GD32等单片机的消息队列设计源码

    intptr_t MsgQueue_PostMsg(msg_queue_t * pMsgQueue, const uint16_t msgId, const uintptr_t param); intptr_t MsgQueue_PostDelayedMsg(msg_queue_t * pMsgQueue, const uint16_t msgId, const uintptr_t param,...

    c___s_t_d_i_n_t_._h_____c(C语言 库文件)

    intptr_t uintptr_t Integer type capable of holding a value converted from a void pointer and then be converted back to that type with a value that compares equal to the original pointer. Optional: ...

    Nginx源代码分析.pdf

    其中 ngx_int_t、ngx_flag_t 都映射为 intptr_t ;ngx_uint_t 映射为 uintptr_t 。这两个类型在 /usr/include/stdint.h 的定义为: /* Types for `void *' pointers. */ #if __WORDSIZE == 64 #ifndef __intptr_t_...

    C#中的IntPtr

    在C#中,`void*`表示一种泛型指针类型,而`IntPtr`则是一种安全的、类型安全的指针类型。在某些情况下,可以将`void*`转换为`IntPtr`以便于使用,但这通常发生在与非托管代码交互时。 2. **与Int32/Int64的关系:*...

    C语言函数库[参照].pdf

    这些类型包括准确长度类型(如intN_t)、最小长度类型(如int_leastN_t)、快速长度类型(如int_fastN_t)以及指针长度类型(如intptr_t)和最大长度类型(如intmax_t)。其中,N代表类型的宽度,通常有8、16、32、...

    Nginx源代码分析

    * intptr_t:整型指针 * uintptr_t:无符号整型指针 字符串数据类型 Nginx对C语言的字符串类型进行了简单的封装,core/ngx_string.h/c里面包含这些封装的内容。包括: * ngx_str_t:字符串类型,包含字符串长度和...

    C语言编程需要注意的64位和32机器的区别.doc

    在处理整数与指针之间的转换时,推荐使用`intptr_t`类型。该类型在不同平台上具有不同的大小,但总是与平台的字长一致。例如,在64位平台上,`intptr_t`为8个字节;而在32位平台上,它为4个字节。 ```c #include ...

    inttypes.h&stdint.h 头文件

    7. `intptr_t`, `uintptr_t`: 用于存储指针的整数类型,可以进行指针与整数之间的转换。 ### stdint.h 头文件 `stdint.h` 的作用与 `inttypes.h` 相似,它同样提供了固定宽度的整数类型定义。然而,`stdint.h` 更...

    inttypes.h和stdint.h文件

    7. `intptr_t`, `uintptr_t`: 这些类型分别是有符号和无符号整数,它们至少能够表示任何指针类型的值。 使用这些类型的一个关键好处是,它们可以确保在不同架构(如32位和64位)上的一致性。例如,如果你需要一个...

    基于Libvlc库的c#中可进行录制/录像功能源码

    public static libvlc_media_player_t Create_MediaPlayer(libvlc_instance_t libvlc_instance, IntPtr handle) { libvlc_media_player_t libvlc_media_player = IntPtr.Zero; try { if (libvlc_instance == ...

    vlc-2.1.3 带录像功能的封装库

    extern public static IntPtr libvlc_new(int argc, IntPtr argv); //创建播放器实例 [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr libvlc_media_player_...

    C语言指针的长度和类型深入分析

    3. `intptr_t`和`uintptr_t`:这两个类型分别是有符号和无符号整型,用于将指针转换为整数形式。它们确保了在进行指针到整数的转换时,能够正确地表示指针的全部地址空间。这些类型在需要将指针作为数值处理时非常...

    vlc-2.2.6 带录像功能的封装库.zip

    extern public static IntPtr libvlc_new(int argc, IntPtr argv); //创建播放器实例 [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr libvlc_media_player_...

    ffmpeg需要用到的头文件inttypes.h inttypedef.h stdint.h

    例如,`inttypedefs.h` 可能会定义 `av_intptr_t` 或 `av_uintptr_t` 这样的类型,它们分别对应于有符号和无符号的指针宽度的整数。这些自定义类型在 FFmpeg 库内部使用,以保持一致性并方便代码维护。 总的来说,...

    C语言:指针的长度和类型

    `intptr_t`和`uintptr_t`是C99标准提供的另外两种类型,它们分别代表有符号和无符号整型,其大小足以容纳任意指针的地址。这两个类型通常用于将指针转换为整数,以便进行位操作或者其他需要将指针视为数值的情况。...

    C#调用Win32 API如何处理指针类型的参数

    在C#中调用Win32 API并处理指针类型的参数,可以通过多种方式实现,包括使用`IntPtr`来代替句柄,使用`ref`关键字来模拟函数参数指针,以及使用数组和编码转换来处理字符串指针。然而,所有这些方法都应遵循最佳实践...

    Linux内核的数据类型.doc

    同时,Linux内核也定义了一些特定的数据类型,例如intptr_t和uintptr_t,它们是能够保存指针值的整型变量。 在设备驱动程序中,通常使用确定大小的类型来定义数据结构,例如u8、u16、u32等。这些类型可以确保数据...

    void_指针 使用

    在C/C++编程语言中,`void`关键字及其关联的`void`指针类型是经常被提及但又常常被忽视的概念。初学者往往容易忽略`void`及其指针类型的重要性和用途,导致在实践中遇到不少困惑。事实上,只有深刻理解`void`指针的...

    stdint.h和inttypes.h文件

    - `%zd`, `%zu`, `%zi` 等是用于格式化输出`size_t`, `uintptr_t`, `intptr_t`等类型的宏。 - `%hh`, `%h`, `%l`, `%ll`, `%j`, `%z`, `%t`, `%p` 等修饰符与对应的`printf`和`scanf`家族函数一起使用,确保正确...

Global site tag (gtag.js) - Google Analytics