C语言指针转换为intptr

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C 语言指针转换为intptr_t 类型

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 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类型是为指针准备的

/* Types for `void *' pointers. */

#if __WORDSIZE == 64

# ifndef __intptr_t_defined

typedef long int intptr_t;

# define __intptr_t_defined

# endif

typedef unsigned long int uintptr_t;

#else

# ifndef __intptr_t_defined

typedef int intptr_t;

# define __intptr_t_defined

# endif

typedef unsigned int uintptr_t;

#endif

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

地址,即地址。

3、指针与intptr_t

C语言指针用来保存变量或常量的地址,地址由处理器的位数决定。在windows程序

中,经常用到句柄,其实就是一个地址,具备通用性,对底层进行了封装。先对这个理解不深刻,什么时候需要将指针转换为intptr_t类型。

4、测试程序

#include

#include

#include

#include

#include

#include

#define ID_STR_LEN 12

#define NAME_STR_LEN 10

typedef struct student

{

char id[ID_STR_LEN];

char name[NAME_STR_LEN];

uint8_t age;

}student;

student * create_student()

{

student *stu = (student *)malloc(sizeof(student));

if (stu == NULL)

return NULL;

memset(stu, 0, sizeof(student));

return stu;

}

void *free_student(student *stu)

{

if (stu)

free(stu);

}

static void init_student(student * stu)

{

assert(stu);

const char *id = "2013112210";

const char *name = "Anker";

uint8_t age = 21;

memcpy(stu->id, id, strlen(id));

相关文档
最新文档