You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指针传值与指针地址疑惑:双指针swap函数传参问题

问题核心:类型不匹配的未定义行为 + 易混淆的两种结果

首先明确两个调用的本质区别:

  • 你的swap函数设计目标是修改指针变量本身,因此要求接收指针变量的地址(int**类型),正确调用方式是swap(&pa, &pb)。此时函数内部会直接修改pa和pb的值(即它们指向的地址),交换后pa指向b、pb指向a,输出pa和pb的地址会是交换后的结果。
  • 若错误传入pa(int*类型),这属于类型不匹配,是C++标准定义的未定义行为——编译器可能报错、警告,或强行执行但结果不可控:
    1. 程序会把pa的值(也就是&a的地址)强行当成int**类型的指针使用;
    2. 函数内部的操作会变成修改原始变量a和b的值,而非pa和pb本身:
      • *ptra = *ptrb 实际是把b的值(10)赋值给a;
      • *ptrb = temp 实际是把原来a的值(5)赋值给b;
    3. 此时pa和pb的指向完全没变,输出它们的地址还是初始的&a和&b,和正确调用的输出完全不同。

你觉得输出结果相同,大概率是混淆了「指针本身的地址值」和「指针指向的变量值」:

  • 正确调用后,*pa的值是10(因为pa现在指向b),*pb的值是5(因为pb现在指向a);
  • 错误调用后,a被改成10、b被改成5,所以*pa的值也是10,*pb的值也是5。
  • 若你输出的是*pa和*pb,看起来结果一致,但本质完全不同:前者是交换了指针的指向,后者是交换了原始变量的值。
关键总结
  • 传入&pa是符合设计的正确用法,修改的是指针变量本身;
  • 传入pa是类型错误的非法用法,属于未定义行为,只是碰巧修改了原始变量的值,导致「指针指向的值」看起来和正确调用一样,但指针本身的指向根本没变化。

内容的提问来源于stack exchange,提问作者ben tenyson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:45:19