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 <sys/types.h> as known by inet code */2 #ifndef __int8_t_defined3 # define __int8_t_defined4 typedef signed char         int8_t;5 typedef short int          int16_t;6 typedef int               int32_t;7 # if __WORDSIZE == 648 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 == 643 # ifndef __intptr_t_defined4 typedef long int               intptr_t;5 #  define __intptr_t_defined6 # endif7 typedef unsigned long int    uintptr_t;8 #else9 # 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、测试程序

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <string.h>
#include <assert.h>

#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));
    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;
}

C语言指针转换为intptr_t类型相关推荐

  1. C语言指针【常见类型】

    指针 指针是很多人头疼的部分,但它的应用无处不在,是编程中不可或缺的一环.无论是在C语言中,还是是C++,亦或是Java,Python中,都有它的应用,各具的名字不同罢了.比如C++中的引用,它的实质 ...

  2. 【C语言】把一个结构体指针转换为另一个结构体指针

    目录 1.结构体说明 2.程序示例 3.结果展示 1.结构体说明 typedef struct {double str1;double str2; } Stu;typedef struct{Stu s ...

  3. c语言教程指针,(转)C语言指针5分钟教程

    指针.引用和取值 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量.在这份教程里"引用"表示计算机内存地址.从指针指向的内存读取数据称作指针的取值 ...

  4. c语言强制转换为结构体,C语言结构体的强制类型转换

    陈浩师兄03年的一篇博客<用C写有面向对象特色的程序>描述了用C语言来实现相似C++类继承的方法,这样方法的核心要点就是结构体的强制类型转换,让我来简单分析分析C语言中的结构体强制类型转换 ...

  5. c语言 指针不能赋值吗,程序员编程C语言指针答疑:指针赋值没那么简单

    C语言指针,纸老虎 一.程序员编程C语言答疑合集 更多C语言学习答疑文章,请参阅:程序员编程C语言答疑文章合集 也可以加入下方我的"C语言答疑课堂"圈子,第一时间看到我给大家带来的 ...

  6. C语言编程拼错的纸条,程序员编程C语言指针答疑:小心scanf函数给指针输错值...

    一.程序员编程C语言答疑合集 https://m.toutiaocdn.com/group/6718545102257521166/?app=news_article&timestamp=15 ...

  7. c语言float转换为int_关于C语言的类型

    在一切的开始,内存只是一片荒芜,后修真者编译天地,便有了今天的锦绣山河. 一块没有使用的内存就像是一片荒凉的大地,为了更方便管理,人们进行区域划分,便有了良田千顷,房屋万座,为了更方便的管理内存,几乎 ...

  8. C语言指针类型 强制转换

    关于C语言指针类型 强制转换  引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...

  9. char类型怎么输入 c语言_还没搞懂C语言指针?这里有最详细的纯干货讲解(附代码)...

    21ic综合自网络信息 指针对于C来说太重要.然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识.所以本文尽可能的通过一篇文章完全讲解指针. 为什么 ...

最新文章

  1. Windows XP下如何设置电脑定时关机
  2. Html 教程 (8)表单
  3. 块级元素(导航,图片,层)的水平和垂直居中
  4. Vestigium-Google CodeJam 2020资格回合问题1解决方案
  5. float php 运算_系统的讲解 - PHP 浮点数高精度运算
  6. 开源项目选择许可证License
  7. 使用MSTest v2进行单元测试的并行化
  8. HashMap排序题
  9. python redis.exceptions.ConnectionError
  10. 【知识向】——计算机基础知识总结及相关
  11. 大专学历就职会不会有瓶颈?
  12. Vue2 Browserslist: caniuse-lite is outdated. Please run: npx browserslist@latest --update-db
  13. 超宽带雷达P440?雷达的快时间慢时间是什么意思?
  14. Markdown——图片、文字显示居中的一种方法
  15. 方差分析 球形检验_spss球形检验.PDF
  16. 各类积分对称性详细总结
  17. 监控摄像头linux开发,PC机(ubuntu)实现usb摄像头监控
  18. Wikibon:云计算2022年及以后的发展趋势
  19. nginx $remote_addr 详解
  20. Docker网络模式解析

热门文章

  1. js中变量作用域的小理解
  2. 佳能MP258的5200错误和P08代码解决方法及清零方法
  3. 生物计算机科学家,科学家开发细胞计算机 人体就是一台大型计算机
  4. mysql用户及权限管理_MySQL 用户及权限管理
  5. java的方法是什么用,Java中的本机方法是什么?它们应该在何处使用?
  6. 电工接线模拟仿真软件_VERICUT数控加工仿真软件,最强的数控加工模拟软件,你知道么?...
  7. 浙江大学linux网络通信,浙江大学钟财军副教授——“Wireless Powered Communication Networks”...
  8. java none怎么用tomcat_使用tomcat做java中间件
  9. 【C++grammar】名字隐藏与重定义
  10. Java——IO(打印流)