seo 发表于 2022-5-31 13:31:06

C语言指针转换为intptr_t类型

C语言指针转换为intptr_t类型发布时间:2022/5/31 13:12:48
            
                                                       
                                                       
            
      
      
               
                  C语言指针转换为intptr_t类型
1、前言

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

2、intptr_t类型

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

位数charshortintlong指针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头文件。

https://common.cnblogs.com/images/copycode.gif

1 /* There is some amount of overlap withas 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
https://common.cnblogs.com/images/copycode.gif

关于intptr_t的类型定义如下:


//intptr_t类型是为指针准备的

https://common.cnblogs.com/images/copycode.gif

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
https://common.cnblogs.com/images/copycode.gif

从定义可以看出,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;
   char name;
   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));
   memcpy(stu->name, name, strlen(name));
   stu->age = age;
}

static int handle_student(intptr_t handle)
{
   if (handle == 0)
   {
   return -1;
   }
   student *stu = (student*)handle;
   printf("id: %s\n", stu->id);
   printf("name: %s\n", stu->name);
   printf("age: %u\n", stu->age);
   return 0;
}

int main()
{
   student *stu;
   stu = create_student();
   init_student(stu);
   //将指针转换为intptr_t类型
   intptr_t handle = (intptr_t)stu;
   handle_student(handle);
   free_student(stu);
   return 0;
}
               
      
      
   
            
      
      
https://www.yilongzhijia.cn/tupian/seo365t.jpg
页: [1]
查看完整版本: C语言指针转换为intptr_t类型