为何C语言中用指针交换变量值的第二种方法无效?
为什么第二种指针交换方法无法改变原始变量的值?
先看第一种可以正常完成值交换的实现:
void interchange_values(int *first_number_pointer, int *second_number_pointer) { int temporal_variable; temporal_variable = *first_number_pointer; *first_number_pointer = *second_number_pointer; *second_number_pointer = temporal_variable; };
这个方法能生效,是因为它通过*操作符直接操作指针指向的内存地址中的数据——也就是原始变量本身的存储位置,修改的是目标变量的实际值。
再看无法实现交换的第二种方法:
void interchange_values(int *first_number_pointer, int *second_number_pointer) { int *temporal_ptr = first_number_pointer; first_number_pointer = second_number_pointer; second_number_pointer = temporal_ptr; };
它失效的核心原因是C语言的函数参数采用值传递机制:
- 当你把原始指针传入函数时,函数会创建两个独立的指针参数副本,这两个副本和原始指针存储了相同的内存地址,但它们是完全独立的变量。
- 函数内部交换的只是这两个副本的指向,并没有触碰原始指针本身,更没有修改指针指向的内存中的数据。
- 当函数执行完毕后,这两个参数副本会被销毁,原始指针和它们指向的变量都不会有任何变化。
简单来说,第二种方法只是在函数内部交换了“指针的副本”,根本没碰要交换的原始变量,自然无法实现值交换。
内容的提问来源于stack exchange,提问作者Jesus Fragoso Jimenez
相关产品推荐
相关产品推荐

