指针交换变量值的C语言秘籍
·
利用指针,交换两个变量的值

#include <stdio.h>
void f1(int *p1,int *p2)
{
int t;
t = *p1;
*p1 = *p2;
*p2 = t;
}
int main()
{
int a,b;
printf("请输入两个数:\n");
scanf("%d %d",&a,&b);
printf("交换前:a = %d,b = %d\n",a,b);
f1(&a,&b);
printf("交换后:a = %d,b = %d\n",a,b);
return 0;
}
这段代码是 C 语言学习中指针(Pointer)最经典、最核心的入门案例。它不仅仅是一个“交换两个数”的程序,更是理解“值传递”与“地址传递”区别的钥匙。
函数定义:void f1(int *p1, int *p2)

- 参数类型
int *:这里声明p1和p2不是普通的整数,而是指向整数的指针。这意味着调用该函数时,必须传入变量的内存地址,而不是变量的值。 - 解引用操作符
*:- 在参数声明中(如
int *p1),*表示“这是一个指针变量”。 - 在函数体中(如
*p1),*是解引用运算符(Dereference Operator)。它的意思是:“去p1存储的那个地址里,把里面的值取出来”或者“修改那个地址里的值”。
- 在参数声明中(如
- 交换逻辑:
t = *p1;:取出p1指向地址中的值(即变量a的值),存入临时变量t。*p1 = *p2;:取出p2指向地址中的值(即变量b的值),写入到p1指向的地址中。此时,外部变量a的值已经被修改了。*p2 = t;:将暂存的t(原a的值)写入到p2指向的地址中。此时,外部变量b的值也被修改了。
主函数:main

&取地址运算符:scanf需要知道把用户输入的数据存到哪里,所以必须提供变量的地址。&a获取变量a在内存中的首地址。- 关键调用:
f1(&a, &b);- 这里没有传
a和b的值(如 10, 20),而是传的它们的地址(如0x7fff...)。 - 这使得
f1函数内部的p1和p2直接“指向”了main函数中的a和b。
- 这里没有传
核心原理:为什么必须用指针?
这是 C 语言初学者最大的痛点:为什么不能直接传 a 和 b?
场景 A:值传递(错误示范)
如果函数写成 void f1_wrong(int x, int y):
- C 语言默认是按值传递(Pass by Value)。
- 调用时,系统会创建
x和y作为a和b的副本(拷贝)。 - 函数内部交换的是
x和y这两个副本。 - 函数结束,
x和y被销毁。 - 结果:
main函数里的a和b毫发无损,交换失败。
场景 B:地址传递(当前代码,正确)
使用 void f1(int *p1, int *p2) 并传入 &a, &b:
- 传递的是地址(门牌号)。
p1拿着a的地址,p2拿着b的地址。- 通过
*p1和*p2操作,相当于直接拿着钥匙打开了main函数栈帧里的房间,修改了里面的家具(数据)。 - 结果:
main函数里的a和b被永久修改。
结论:若要在函数内部修改外部变量的值,必须传递该变量的地址(使用指针)。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)