如何通过指针加法定位地址,修改该位置指针指向新地址(非下标赋值)
用指针加法定位地址并修改指针指向的实现方法
按照你要求的三个步骤,以下是标准的实现方式,同时修正了你示例代码中的未定义变量、类型转换不严谨等问题:
核心步骤
- 创建定位用的指针变量
change_ptr,将其绑定到目标指针数组的起始地址 - 通过指针加法计算出要修改的指针所在的内存地址:指针数组中每个元素是
int*类型,因此偏移量为sizeof(int*)的整数倍(比如要修改第2个元素,就偏移1倍的sizeof(int*)) - 将计算得到的地址转换为对应类型的指针,再赋值使其指向新的目标地址
完整代码示例
#include <stdio.h> #include <stdint.h> int *ptr[5]; // 定义包含5个int类型指针的数组 int new_target = 2024; // 示例:新指针指向的目标数据 int main() { // 步骤1:创建定位指针,初始化为指针数组的起始地址 void *change_ptr = ptr; // 步骤2:通过指针加法定位到ptr[1]的内存地址(偏移1个int*的大小) void *target_addr = change_ptr + sizeof(int*); // 步骤3:转换为指向int*的指针,修改其指向的内容为new_target的地址 *(int**)target_addr = &new_target; // 验证修改结果 printf("ptr[1]指向的值:%d\n", *ptr[1]); // 输出2024 return 0; }
关键注意事项
- 偏移量的正确性:直接使用
sizeof(int*)而非硬编码字节数,能保证代码在32位、64位等不同平台下的兼容性 - 类型转换的必要性:
void*类型无法直接解引用赋值,必须转换为int**(指向int*的指针),才能正确操作目标地址处的指针变量 - 越界风险:必须确保指针加法后的地址属于目标数组的有效范围,否则会触发未定义行为
内容的提问来源于stack exchange,提问作者WhoAmIWhereAmIWhatIAmDoing
相关产品推荐
相关产品推荐

