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. Mac下安装Node.js
  2. 外卖市场的搅屎棍要来了?字节跳动内测“心动外卖”!
  3. 能量时域空间物理_5G新在哪儿(11)-下行公共物理控制信道
  4. 算法导论 c语言,算法导论 之 堆排序[C语言]
  5. CodeForces - 1312E Array Shrinking(区间dp)
  6. 斯坦福大学深度学习视频(CS231n课程)
  7. codeforces 932D Tree 倍增法+二分搜索
  8. linux java运行环境_linux(centos)中java运行环境_jdk安装与配置 | OPS技术联盟
  9. 制作旅行英语图书封面
  10. RK3399平台开发系列讲解(网络篇)7.11、图解Linux网络包接收过程
  11. IOS内存泄漏动静态方法排查
  12. linux zsh 终端,linux安装zsh终端
  13. 小学生猜成语html5攻略,小学生猜成语最新成语游戏集锦
  14. ESP8266+Flash基本操作
  15. 用python写12306系统_Python实现12306火车票抢票系统
  16. app前端图形验证码(全部代码)
  17. 通过软链接mklink共享node_modules
  18. python png转jpg
  19. 同花顺python_python 同花顺接口用Python实现一个简单的算术游戏
  20. 数据结构01-------数据结构的介绍

热门文章

  1. selenium 等待页面加载完成
  2. C++ new/new operator、operator new、placement new初识
  3. 传128GB版iPad4售价为799/929美元
  4. bmp调色板颜色信息重复_如何更改 Linux 终端颜色主题 | Linux 中国
  5. mysql 二叉树表设计_mysql---B+tree索引的设计原理
  6. 手型向下 点击一下 福昕_PPT多张缩略图点击放大展示
  7. pymol怎么做底物口袋表面_怎么从文献中发掘一篇新文章?
  8. c语言有趣代码_【新课预知】——C语言程序设计
  9. dp笔记:关于DP算法和滚动数组优化的思考
  10. Java Hashtable size()方法与示例