1. 函数交换原理与实现基础
指针作为C语言的精髓所在,其核心价值在于直接操作内存地址。当我们声明void swap(float * px, float * py)时,这个函数接收的是两个float类型变量的地址而非值本身。理解这一点需要从内存布局说起:
每个float变量在内存中占据4字节连续空间(32位系统),假设变量a存储在地址0x1000-0x1003,变量b在0x1004-0x1007。当调用swap(&a, &b)时,px实际保存的是0x1000这个起始地址,py保存0x1004。通过解引用操作符*,我们可以直接修改这两个地址存储的内容。
关键认知:所有传指针的操作本质上都是传地址的"值传递",只不过这个值是内存地址。函数内修改的是该地址指向的内容,而非地址本身。
经典的三步交换算法在指针场景下的实现:
c复制void swap(float *px, float *py) {
float temp = *px; // 读取px地址存储的值
*px = *py; // 将py地址的值写入px地址
*py = temp; // 将暂存的值写入py地址
}
内存变化过程示例:
- 初始状态:
- 地址0x1000: 3.14 (变量a)
- 地址0x1004: 2.71 (变量b)
- 执行temp = *px后:
- temp = 3.14
- 执行*px = *py后:
- 地址0x1000: 2.71
- 执行*py = temp后:
- 地址0x1004: 3.14
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 完整实现与验证框架
下面是一个包含边界条件测试的完整实现方案:
c复制#include <stdio.h>
#include <stdbool.h>
// 函数声明
void swap(float *px, float *py);
// 验证辅助函数
bool float_equal(float a, float b) {
return fabs(a - b) < 1e-6; // 处理浮点数精度问题
}
int main() {
// 基础测试用例
float test1_a = 3.1415926
