如何保存指针地址供其他指针使用?如何将指针地址存入普通变量复用?
嘿,咱们把你的问题拆开来逐个解决,这在C语言里是挺常见的需求,但得注意一些标准和可移植性的细节哦!
1. 如何保存指针的地址,让另一个指针基于该地址操作?
其实最直接的方式就是直接把指针赋值给另一个指针,比如你提到的p2 = p1;——这时候p2就持有了和p1完全相同的地址,后续用p2操作和用p1操作是完全一样的,因为它们指向同一块内存。
如果需要先把地址存到一个中间变量里再转给p2,那核心就是把指针的“值”(也就是它存储的内存地址)保存下来,之后再把这个值转回指针类型就行,这就涉及到你第二个问题里的内容了。
2. 能否把指针地址存到普通变量(比如int)再转回指针?
答案是可以,但绝对不推荐用普通的int或者long,原因很简单:不同架构下,指针的大小可能和int/long不匹配。比如在64位系统中,指针是8字节(64位),但int通常是4字节(32位),这时候把指针转成int会直接截断地址,导致后续转回来的指针完全无效,触发未定义行为。
C标准为这种场景提供了专门的类型:uintptr_t和intptr_t,它们定义在<stdint.h>头文件里。这两个类型是标准保证的、能够完整容纳指针值的整数类型——也就是说,只要你用这两个类型存储指针地址,再转回去就不会有问题。
给你写个实际的代码示例:
#include <stdint.h> #include <stdio.h> int main() { int num = 123; int* p1 = # // 把指针地址存储到标准整数类型中 uintptr_t addr_p1 = (uintptr_t)p1; // 把整数转回指针类型,这就是你说的"doMagicCast" int* p2 = (int*)addr_p1; // 验证一下,p2和p1指向同一个变量 printf("*p1 = %d, *p2 = %d\n", *p1, *p2); // 输出*p1 = 123, *p2 = 123 return 0; }
一些关键注意事项:
- 一定要包含
<stdint.h>头文件才能使用uintptr_t/intptr_t。 - 尽量用
uintptr_t(无符号型),因为内存地址本身就是无符号的,用无符号类型更符合语义。 - 转换的时候要保证类型匹配:比如你存的是
int*的地址,转回来必须是int*,不能随便转成char*或者其他类型(除非你明确知道类型兼容,否则会有未定义行为)。 - 如果你非要用
long(不推荐),在某些64位系统里可能暂时能用,但代码的可移植性会极差,换个32位系统或者不同架构就会出问题,所以强烈建议用标准的uintptr_t。
内容的提问来源于stack exchange,提问作者user3085931
相关产品推荐
相关产品推荐

