7.3 指针与函数
为什么需要指针参数
C 默认按值传递(pass by value):调用函数时,实参的值会复制给形参。所以想用一个函数交换两个变量的值时,下面这种写法会失败——它只交换了函数内部的副本。
c
void swap_wrong(int a, int b) {
int temp = a;
a = b;
b = temp; // 只换了副本,调用者的变量没变
}把变量的地址传进去,函数就能通过指针修改调用者的变量:
c
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main(void) {
int x = 3, y = 5;
swap(&x, &y);
printf("%d %d\n", x, y); // 5 3
return 0;
}&x 取得 x 的地址,*a 访问这个地址上的值,于是交换真正作用在 x 和 y 上。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
用指针返回多个结果
函数最多只能 return 一个值。如果需要带回多个结果,可以把变量的地址作为参数传入,函数通过指针把结果写回调用者提供的变量。
c
void divmod(int a, int b, int *q, int *r) {
*q = a / b;
*r = a % b;
}
int main(void) {
int q, r;
divmod(17, 5, &q, &r);
printf("%d ... %d\n", q, r); // 3 ... 2
return 0;
}下面用同样的思路解一元二次方程 ax² + bx + c = 0:用返回值表示“是否有实根”,再用指针带回两个根。
c
#include <math.h>
#include <stdbool.h>
bool solve(double a, double b, double c, double *x1, double *x2) {
double delta = b * b - 4 * a * c;
if (delta < 0) {
return false; // 没有实根
}
*x1 = (-b + sqrt(delta)) / (2 * a);
*x2 = (-b - sqrt(delta)) / (2 * a);
return true;
}调用者先看返回的 bool 判断是否有解,再从 x1、x2 读取结果。
正在加载本节练习...