C语言指针转换为intptr_t类型
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类型相关推荐
- C语言指针【常见类型】
指针 指针是很多人头疼的部分,但它的应用无处不在,是编程中不可或缺的一环.无论是在C语言中,还是是C++,亦或是Java,Python中,都有它的应用,各具的名字不同罢了.比如C++中的引用,它的实质 ...
- 【C语言】把一个结构体指针转换为另一个结构体指针
目录 1.结构体说明 2.程序示例 3.结果展示 1.结构体说明 typedef struct {double str1;double str2; } Stu;typedef struct{Stu s ...
- c语言教程指针,(转)C语言指针5分钟教程
指针.引用和取值 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量.在这份教程里"引用"表示计算机内存地址.从指针指向的内存读取数据称作指针的取值 ...
- c语言强制转换为结构体,C语言结构体的强制类型转换
陈浩师兄03年的一篇博客<用C写有面向对象特色的程序>描述了用C语言来实现相似C++类继承的方法,这样方法的核心要点就是结构体的强制类型转换,让我来简单分析分析C语言中的结构体强制类型转换 ...
- c语言 指针不能赋值吗,程序员编程C语言指针答疑:指针赋值没那么简单
C语言指针,纸老虎 一.程序员编程C语言答疑合集 更多C语言学习答疑文章,请参阅:程序员编程C语言答疑文章合集 也可以加入下方我的"C语言答疑课堂"圈子,第一时间看到我给大家带来的 ...
- C语言编程拼错的纸条,程序员编程C语言指针答疑:小心scanf函数给指针输错值...
一.程序员编程C语言答疑合集 https://m.toutiaocdn.com/group/6718545102257521166/?app=news_article×tamp=15 ...
- c语言float转换为int_关于C语言的类型
在一切的开始,内存只是一片荒芜,后修真者编译天地,便有了今天的锦绣山河. 一块没有使用的内存就像是一片荒凉的大地,为了更方便管理,人们进行区域划分,便有了良田千顷,房屋万座,为了更方便的管理内存,几乎 ...
- C语言指针类型 强制转换
关于C语言指针类型 强制转换 引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...
- char类型怎么输入 c语言_还没搞懂C语言指针?这里有最详细的纯干货讲解(附代码)...
21ic综合自网络信息 指针对于C来说太重要.然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识.所以本文尽可能的通过一篇文章完全讲解指针. 为什么 ...
最新文章
- Windows XP下如何设置电脑定时关机
- Html 教程 (8)表单
- 块级元素(导航,图片,层)的水平和垂直居中
- Vestigium-Google CodeJam 2020资格回合问题1解决方案
- float php 运算_系统的讲解 - PHP 浮点数高精度运算
- 开源项目选择许可证License
- 使用MSTest v2进行单元测试的并行化
- HashMap排序题
- python redis.exceptions.ConnectionError
- 【知识向】——计算机基础知识总结及相关
- 大专学历就职会不会有瓶颈?
- Vue2 Browserslist: caniuse-lite is outdated. Please run: npx browserslist@latest --update-db
- 超宽带雷达P440?雷达的快时间慢时间是什么意思?
- Markdown——图片、文字显示居中的一种方法
- 方差分析 球形检验_spss球形检验.PDF
- 各类积分对称性详细总结
- 监控摄像头linux开发,PC机(ubuntu)实现usb摄像头监控
- Wikibon:云计算2022年及以后的发展趋势
- nginx $remote_addr 详解
- Docker网络模式解析
热门文章
- js中变量作用域的小理解
- 佳能MP258的5200错误和P08代码解决方法及清零方法
- 生物计算机科学家,科学家开发细胞计算机 人体就是一台大型计算机
- mysql用户及权限管理_MySQL 用户及权限管理
- java的方法是什么用,Java中的本机方法是什么?它们应该在何处使用?
- 电工接线模拟仿真软件_VERICUT数控加工仿真软件,最强的数控加工模拟软件,你知道么?...
- 浙江大学linux网络通信,浙江大学钟财军副教授——“Wireless Powered Communication Networks”...
- java none怎么用tomcat_使用tomcat做java中间件
- 【C++grammar】名字隐藏与重定义
- Java——IO(打印流)