首页 > 其他分享 >intptr_t和uintptr_t类型

intptr_t和uintptr_t类型

时间:2022-11-30 21:35:01浏览次数:39  
标签:intptr name int uintptr stu student 类型

看代码看到intptr_t和uintptr_t类型,有些不明白,查找后总结如下
参考http://www.cnblogs.com/Anker/p/3438480.html
这2个类型定义如下

/* 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

上面分开64位机器非64位,64位上intptr_t、uintptr_t分别是long int和unsigned long int的别名,非64位是int、unsigned int的别名。

这和指针有什么关系?

如下表
在这里插入图片描述

64位机器上指针占8字节,long类型也占8字节,32位机器上指针占用4字节,int类型也占用4字节,所以intptr_t、uintptr_t才这样取别名就是为了能让整数类型与指针互相转换,且注意到为了兼容16位机器,在非64位机器的intptr_t、uintptr_t用int来取别名,而不是long。
总而言之就是:intptr_t是为了跨平台,其长度总是所在平台的位数,所以用来存放地址。
好处是啥???其实我们看明白,感觉是说不会解引用,能进行加减操作,更方便(我没理解到)

intptr_t、uintptr_t有什么区别???

UIntPtr和IntPtr的区别类似UInt32和Int32的区别,一个是无符号的32位整数(本质是一个地址),一个是有符号的32位整数。UInt32能表示更大的值,代价是没有符号位
都表示地址了,符号位还有存在必要吗???

具体怎么使用???

下面这个例子

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

标签:intptr,name,int,uintptr,stu,student,类型
From: https://www.cnblogs.com/amxiang/p/16939818.html

相关文章

  • ServletContext-功能-获取MIME类型、域对象、获取文件服务器路径
    ServletContext-功能-获取MIME类型获取MIME类型:MIME类型:在互联网通信过程中定义的一种文件数据类型格式:大类型/小类型text/htmlimage/jpeg获......
  • 记一次由mybatis的判空类型的错误
    差不多是这种形状的异常:###Errorqueryingdatabase. Cause:java.lang.IllegalArgumentException:invalidcomparison:java.util.Dateandjava.lang.String###Cau......
  • java数据类型
    java语言的数据类型分为:基本数据类型,引用数据类型基本数据类型的四类八种整数byte取值范围-128~127shortintlong浮点数floatdouble字符charbuer......
  • RocketMQ 的消费者类型详解与最佳实践
    作者:凌楚在RocketMQ5.0中,更加强调了客户端类型的概念,尤其是消费者类型。为了满足多样的RocketMQ中一共有三种不同的消费者类型,分别是PushConsumer、SimpleConsumer和......
  • RocketMQ 的消费者类型详解与最佳实践
    作者:凌楚在RocketMQ5.0中,更加强调了客户端类型的概念,尤其是消费者类型。为了满足多样的RocketMQ中一共有三种不同的消费者类型,分别是PushConsumer、SimpleConsumer......
  • 关于mybatis中基本类型 条件判断问题
    Mybatis默认采用ONGL解析参数,所以会自动采用对象树的形式取Integer.xxx。Integer对象没有xxx属性。如果不解析参数,mybatis自动识别传入的参数,不会报错。解决办法1.修改selec......
  • day04 数据类型II
    1.字典类型(dict)字典是一个无序、键不重复且元素只能是键值对的可变的容器。info={"k1":123,"k2":999}键值对键不能重复,重复时数据会被覆盖。info......
  • jstl一些标签 中timestamp类型在页面去掉时分秒!
    <fmt:formatDatevalue='${vo.updateDate}'pattern='yyyy-MM-dd'/>  JSTL的ifelse:有c:if没有else的处理分类:JSP/JAVA/J2EE(11)作者同类文章X jstl的......
  • day03 数据类型I
    数据类型学汉语:拼音、数字、汉字、词语、成语,写文章--->老师批改。学编程:整型、字符串、布尔值,写程序(写代码)->计算机。布尔值(bool):TrueFalse整型(int) :119......
  • 云小课|云小课教您如何选择Redis实例类型
    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击......