指针传值与指针地址疑惑:双指针swap函数传参问题
问题核心:类型不匹配的未定义行为 + 易混淆的两种结果
首先明确两个调用的本质区别:
- 你的
swap函数设计目标是修改指针变量本身,因此要求接收指针变量的地址(int**类型),正确调用方式是swap(&pa, &pb)。此时函数内部会直接修改pa和pb的值(即它们指向的地址),交换后pa指向b、pb指向a,输出pa和pb的地址会是交换后的结果。 - 若错误传入
pa(int*类型),这属于类型不匹配,是C++标准定义的未定义行为——编译器可能报错、警告,或强行执行但结果不可控:- 程序会把
pa的值(也就是&a的地址)强行当成int**类型的指针使用; - 函数内部的操作会变成修改原始变量
a和b的值,而非pa和pb本身:*ptra = *ptrb实际是把b的值(10)赋值给a;*ptrb = temp实际是把原来a的值(5)赋值给b;
- 此时
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
相关产品推荐
相关产品推荐

