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_defined
 3 # define __int8_t_defined
 4 typedef signed char         int8_t;
 5 typedef short int          int16_t;
 6 typedef int               int32_t;
 7 # if __WORDSIZE == 64
 8 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 == 64
 3 # ifndef __intptr_t_defined
 4 typedef long int               intptr_t;
 5 #  define __intptr_t_defined
 6 # endif
 7 typedef unsigned long int    uintptr_t;
 8 #else
 9 # 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、测试程序

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <stdint.h>
 5 #include <string.h>
 6 #include <assert.h>
 7
 8 #define ID_STR_LEN   12
 9 #define NAME_STR_LEN 10
10
11 typedef struct student
12 {
13     char id[ID_STR_LEN];
14     char name[NAME_STR_LEN];
15     uint8_t age;
16 }student;
17
18 student * create_student()
19 {
20     student *stu = (student *)malloc(sizeof(student));
21     if (stu == NULL)
22     return NULL;
23     memset(stu, 0, sizeof(student));
24     return stu;
25 }
26
27 void *free_student(student *stu)
28 {
29     if (stu)
30     free(stu);
31 }
32
33 static void init_student(student * stu)
34 {
35     assert(stu);
36     const char *id = "2013112210";
37     const char *name = "Anker";
38     uint8_t age = 21;
39     memcpy(stu->id, id, strlen(id));
40     memcpy(stu->name, name, strlen(name));
41     stu->age = age;
42 }
43
44 static int handle_student(intptr_t handle)
45 {
46     if (handle == 0)
47     {
48     return -1;
49     }
50     student *stu = (student*)handle;
51     printf("id: %s\n", stu->id);
52     printf("name: %s\n", stu->name);
53     printf("age: %u\n", stu->age);
54     return 0;
55 }
56
57 int main()
58 {
59     student *stu;
60     stu = create_student();
61     init_student(stu);
62     //将指针转换为intptr_t类型
63     intptr_t handle = (intptr_t)stu;
64     handle_student(handle);
65     free_student(stu);
66     return 0;
67 }

时间: 2024-08-30 06:28:07

C语言指针转换为intptr_t类型的相关文章

C语言指针的长度和类型深入分析_C 语言

指针是C语言的精髓,本文就以实例的形式详细分析了C语言的长度和类型.对于初学者深入理解C语言程序设计有很好的参考价值.具体分析如下: 一般来说,如果考虑应用程序的兼容性和可移植性,指针的长度就是一个问题,在大部分现代平台上,数据指针的长度通常是一样的,与指针类型无关,尽管C标准没有规定所有类型指针的长度相同,但是通常实际情况就是这样.但是函数指针长度可能与数据指针的长度不同. 指针的长度取决于使用的机器和编译器,例如:在现代windows上,指针是32位或是64位长 测试代码如下: #inclu

C语言指针的长度和类型

如果考虑应用程序的兼容性和可移植性,指针的长度就是一个问题,在大部分现代平台上,数据指针的长度通常是一样的,与指针类型无关,尽管C标准没有规定所有类型指针的长度相同,但是通常实际情况就是这样.但是函数指针长度可能与数据指针的长度不同. 指针的长度取决于使用的机器和编译器,例如:在现代windows上,指针是32位或是64位长 测试代码: #include<stdio.h> #include<math.h> #include<stdlib.h> #include<s

编程c语言-c语言指针问题 char *p=&amp;amp;quot;abcdefg&amp;amp;quot;+1; 为什么会报错,const char*无法转换为char*

问题描述 c语言指针问题 char *p="abcdefg"+1: 为什么会报错,const char*无法转换为char* char p="abcdefg"+1: 为什么会报错,const char无法转换为char* 解决方案 abcdefg是const 不能直接加一 解决方案二: 我想我知道了,字符串是const的对象所以指向他的指针也必须用const修饰,但这样又有个问题了char* p="ddd":为什么就可以呢?"ddd&q

C语言指针入门学习面面观_C 语言

这似乎是一个很凝重的话题,但是它真的很有趣. 1. 指针是指向某一类型的东西,任何一个整体,只要能称为整体就能拥有它自己的独一无二的指针类型,所以指针的类型其实是近似无穷无尽的 2. 函数名在表达式中总是以函数指针的身份呈现,除了取地址运算符以及sizeof 3. C语言最晦涩难明的就是它复杂的声明: void (*signal(int sig, void (*func)(int)))(int),试试着把它改写成容易理解的形式 4. 对于指针,尽最大的限度使用const保护它,无论是传递给函数,

C语言 指针与二维数组详解_C 语言

二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; 从概念上理解,a 的分布像一个矩阵: 0   1   2   3 4   5   6   7 8   9  10  11 但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存: C语言中的二维数组是按行排列的,也就是先存放 a[

IOS开发之路--C语言指针_IOS

概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移越来越模糊,感觉指针难以掌握,本文通过简单的例子试图将指针解释清楚,今天的重点有几个方面: 什么是指针 数组和指针 函数指针 什么是指针 存放变量地址的变量我们称之为"指针变量",简单的说变量p中存储的是变量a的地址,那么p就可以称为是指针变量,或者说p指向a.当我们访问a变量的时候其实是程序先根据a取得a对应的地址,再到这个地址对应的存储空间中拿到a的值,这种方式我们称之为"直接

C语言指针使用方法

为初学者服务.这是本文的宗旨.指针是c和c++中的难点和重点.有些程序员们精通dos下的basic.c语言的其它各种特性,在basic中都有类似的东西.只有指针,是baisc所不具备的.指针是c的灵魂. 我不想重复大多数书上说得很清楚的东西,我只是把我看过的书中说得不清楚或没有说,而我又觉得我理解得有点道理的东西写出来. 1.指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指

Swift与C语言指针结合使用实例

  这篇文章主要介绍了Swift与C语言指针结合使用实例,本文讲解了用以输入/输出的参数指针.作为数组使用的参数指针.用作字符串参数的指针.指针参数转换的安全性等内容,需要的朋友可以参考下 Objective-C和C的API常常会需要用到指针.Swift中的数据类型都原生支持基于指针的Cocoa API,不仅如此,Swift会自动处理部分最常用的将指针作为参数传递的情况.这篇文章中,我们将着眼于在Swift中让C语言指针与变量.数组和字符串共同工作. ####用以输入/输出的参数指针 C和Obj

c++-CString类型(汉字)转换为wchar_t类型时显示的为乱码

问题描述 CString类型(汉字)转换为wchar_t类型时显示的为乱码 如题,从编辑框中提取汉字,取出为CString类型的,将此变量转换为wchar____t类型的变量,显示出来为乱码,但是当输入的为英文字母时,显示的就是正确的,不知道问题出现在哪里,求大神指点 ! 部分程序: 解决方案 最简单的将你的工程设置为Unicode编码的. 解决方案二: 如何从 wchar_t * 转换为其他字符串类型 解决方案三: _tsetlocale(LC_ALL, _T("chs")); //