C语言指针转换为intptr_t类型

转载 2016年06月01日 11:08:50

1、前言

  今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量。由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针。感觉很奇怪,为何要将一个指针这样做呢?如是果断上网查查,发现我的感觉是错误的,所以,任何事情不能凭感觉,要弄清楚来龙去脉。先总结一下intptr_t类型,然后介绍指针与intptr_t类型的转换,最后给出测试程序。

2、intptr_t类型

  我接触最早的处理器是32位,目前64位处理器发展迅速。数据类型特别是int相关的类型在不同位数机器的平台下长度不同。C99标准并不规定具体数据类型的长度大小。

位数 char short int long 指针
16  1个字节8位   2个字节16位  2个字节16位  4个字节32位 2个字节16位
32  1个字节8位   2个字节16位 4个字节32位  4个字节32位 4个字节32位
64  1个字节8位   2个字节16位  4个字节32位  8个字节64位 8个字节64位

为了保证平台的通用性,程序中尽量不要使用long类型。可以使用固定大小的数据类型宏定义,这些宏定义需要引用stdint.h头文件。

复制代码
 1 /* There is some amount of overlap with <sys/types.h> as known by inet code */
 2 #ifndef __int8_t_defined
 3 # define __int8_t_defined
 4 typedef signed char         int8_t;
 5 typedef short int          int16_t;
 6 typedef int               int32_t;
 7 # if __WORDSIZE == 64
 8 typedef long int          int64_t;
 9 # else
10 __extension__
11 typedef long long int        int64_t;
12 # endif
13 #endif
14 
15 /* Unsigned.  */
16 typedef unsigned char         uint8_t;
17 typedef unsigned short int    uint16_t;
18 #ifndef __uint32_t_defined
19 typedef unsigned int          uint32_t;
20 # define __uint32_t_defined
21 #endif
22 #if __WORDSIZE == 64
23 typedef unsigned long int       uint64_t;
24 #else
25 __extension__
26 typedef unsigned long long int    uint64_t;
27 #endif
复制代码

关于intptr_t的类型定义如下:

//intptr_t类型是为指针准备的
复制代码
 1 /* Types for `void *' pointers.  */
 2 #if __WORDSIZE == 64
 3 # ifndef __intptr_t_defined
 4 typedef long int               intptr_t;
 5 #  define __intptr_t_defined
 6 # endif
 7 typedef unsigned long int    uintptr_t;
 8 #else
 9 # ifndef __intptr_t_defined
10 typedef int                    intptr_t;
11 #  define __intptr_t_defined
12 # endif
13 typedef unsigned int        uintptr_t;
14 #endif
复制代码

从定义可以看出,intptr_t在不同的平台是不一样的,始终与地址位数相同,因此用来存放地址,即地址。

3、指针与intptr_t

  C语言指针用来保存变量或常量的地址,地址由处理器的位数决定。在windows程序中,经常用到句柄,其实就是一个地址,具备通用性,对底层进行了封装。先对这个理解不深刻,什么时候需要将指针转换为intptr_t类型。

4、测试程序

复制代码
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <stdint.h>
 5 #include <string.h>
 6 #include <assert.h>
 7 
 8 #define ID_STR_LEN   12
 9 #define NAME_STR_LEN 10
10 
11 typedef struct student
12 {
13     char id[ID_STR_LEN];
14     char name[NAME_STR_LEN];
15     uint8_t age;
16 }student;
17 
18 student * create_student()
19 {
20     student *stu = (student *)malloc(sizeof(student));
21     if (stu == NULL)
22     return NULL;
23     memset(stu, 0, sizeof(student));
24     return stu;
25 }
26 
27 void *free_student(student *stu)
28 {
29     if (stu)
30     free(stu);
31 }
32 
33 static void init_student(student * stu)
34 {
35     assert(stu);
36     const char *id = "2013112210";
37     const char *name = "Anker";
38     uint8_t age = 21;
39     memcpy(stu->id, id, strlen(id));
40     memcpy(stu->name, name, strlen(name));
41     stu->age = age;
42 }
43 
44 static int handle_student(intptr_t handle)
45 {
46     if (handle == 0)
47     {
48     return -1;
49     }
50     student *stu = (student*)handle;
51     printf("id: %s\n", stu->id);
52     printf("name: %s\n", stu->name);
53     printf("age: %u\n", stu->age);
54     return 0;
55 }
56 
57 int main()
58 {
59     student *stu;
60     stu = create_student();
61     init_student(stu);
62     //将指针转换为intptr_t类型
63     intptr_t handle = (intptr_t)stu;
64     handle_student(handle);
65     free_student(stu);
66     return 0;
67 }
复制代码

5、参考网址

http://blog.163.com/tianle_han/blog/static/6617826200910663018319/

http://hi.baidu.com/woxmpmcafubctzq/item/67efee5764ebec07e7c4a5d5

C语言指针转换为intptr_t类型

http://www.cnblogs.com/Anker/p/3438480.html 1、前言   今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量。由于之前没有见过in...
  • bytxl
  • bytxl
  • 2014年04月27日 10:36
  • 875

intptr_t详解

看leveldb代码时候发现inptr_t居然不知道是啥,
  • macchan
  • macchan
  • 2014年08月20日 09:46
  • 4525

C语言中不同类型的结构体的指针间可以强制转换

C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险。只要理解了其内部机制,你会发现C是非常灵活的。 一. 结构体声明如何内存的分布,  结构体指针声明结构体的首地址,  结...
  • xiaoshengqdlg
  • xiaoshengqdlg
  • 2014年04月22日 17:34
  • 1542

c语言 指针转换为整数或者 整数转换为指针

INT36-C. Converting a pointer to integer or integer to pointer Skip to end of metadata C...
  • deltatang
  • deltatang
  • 2014年12月04日 01:13
  • 1493

C语言:指针类型强制性转换

C语言:指针类型强制性转换标签:C语言 指针 强制性转换by 小威威1.引入我们知道,每个变量都有对应的地址,地址的距离即为地址之差。然而,地址类型不同,也就不能进行减法运算。假如,我现在要求doub...
  • linwh8
  • linwh8
  • 2015年12月17日 20:35
  • 1017

C语言: 指针强制类型转换

1. 指向字符串的指针强制转换成指向整型的指针: #include #include #include int main(int argc, char** argv) {  char...
  • mayouyang
  • mayouyang
  • 2015年03月16日 18:00
  • 1680

C语言中一维指针与二维指针的转化

首先说个最特殊的指针 void×,这个是当初为了指针转化的方便,设立的一个万能指针。任何指针都能与之转化。 看两个定义:typedef int ×t; t a[10]; typedef int t...
  • psh2009
  • psh2009
  • 2012年10月19日 16:14
  • 2369

C语言中整型与指针之间转换的注意点

为什么写这篇文章?
  • astrotycoon
  • astrotycoon
  • 2016年04月10日 17:31
  • 1416

Objective-c - 万能指针(id指针 / NSObject指针)

/* Objective-c - 万能指针(id指针 / NSObject指针)    NSObject万能指针和id指针都是万能指针,他们都可以指向任意的OC对象.    1...
  • xuezhangjun0121
  • xuezhangjun0121
  • 2017年01月03日 18:18
  • 739

C语言文件指针与文件描述符之间可以相互转换

C语言文件指针与文件描述符之间可以相互转换: 这要通过fdopen和fileno两个函数实现。它们都包含在头文件stdio.h中。 fdopen的原型: FILE ...
  • YUAN1125
  • YUAN1125
  • 2016年06月29日 10:45
  • 565
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言指针转换为intptr_t类型
举报原因:
原因补充:

(最多只允许输入30个字)