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语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识.所以本文尽可能的通过一篇文章完全讲解指针. 为什么 ...
最新文章
- Mac下安装Node.js
- 外卖市场的搅屎棍要来了?字节跳动内测“心动外卖”!
- 能量时域空间物理_5G新在哪儿(11)-下行公共物理控制信道
- 算法导论 c语言,算法导论 之 堆排序[C语言]
- CodeForces - 1312E Array Shrinking(区间dp)
- 斯坦福大学深度学习视频(CS231n课程)
- codeforces 932D Tree 倍增法+二分搜索
- linux java运行环境_linux(centos)中java运行环境_jdk安装与配置 | OPS技术联盟
- 制作旅行英语图书封面
- RK3399平台开发系列讲解(网络篇)7.11、图解Linux网络包接收过程
- IOS内存泄漏动静态方法排查
- linux zsh 终端,linux安装zsh终端
- 小学生猜成语html5攻略,小学生猜成语最新成语游戏集锦
- ESP8266+Flash基本操作
- 用python写12306系统_Python实现12306火车票抢票系统
- app前端图形验证码(全部代码)
- 通过软链接mklink共享node_modules
- python png转jpg
- 同花顺python_python 同花顺接口用Python实现一个简单的算术游戏
- 数据结构01-------数据结构的介绍
热门文章
- selenium 等待页面加载完成
- C++ new/new operator、operator new、placement new初识
- 传128GB版iPad4售价为799/929美元
- bmp调色板颜色信息重复_如何更改 Linux 终端颜色主题 | Linux 中国
- mysql 二叉树表设计_mysql---B+tree索引的设计原理
- 手型向下 点击一下 福昕_PPT多张缩略图点击放大展示
- pymol怎么做底物口袋表面_怎么从文献中发掘一篇新文章?
- c语言有趣代码_【新课预知】——C语言程序设计
- dp笔记:关于DP算法和滚动数组优化的思考
- Java Hashtable size()方法与示例