// 错误示例1:参数个数不匹配
int add(int a, int b) {
return a + b;
}
int main() {
int res = add(10); // 实参个数少1,编译报错
return 0;
}
// 错误示例2:值传递修改实参(逻辑错误)
void swap(int a, int b) {
int temp = a;
a = b;
b = temp; // 仅修改形参,实参不变
}
int main() {
int x=1, y=2;
swap(x, y);
printf("%d,%d\n", x, y); // 输出1,2(未交换)
return 0;
}
例题精选
例题1:函数定义与调用(求和函数)
定义一个int型求和函数add(int a, int b),在main函数中调用该函数计算15+25的结果并输出。
#include
// 函数声明
int add(int a, int b);
int main() {
int num1 = 15, num2 = 25;
// 调用求和函数
int sum = add(num1, num2);
printf("%d + %d = %d\n", num1, num2, sum);
return 0;
}
// 函数定义
int add(int a, int b) {
return a + b;
}
运行结果:
15 + 25 = 40
解析:
1. 函数声明`int add(int a, int b);`解决了"调用在前、定义在后"的编译问题;
2. 实参num1、num2传递给形参a、b,值传递方式下a=15、b=25;
3. return语句将a+b的结果返回,main函数中用sum接收并输出;
4. 若省略函数声明,部分编译器会报"隐式声明"警告,建议养成声明习惯。
例题2:值传递与地址传递对比(交换两个数)
分别用值传递和地址传递实现交换两个整数的函数,对比执行结果。
#include
// 值传递交换(无效)
void swap1(int a, int b) {
int temp = a;
a = b;
b = temp;
}
// 地址传递交换(有效)
void swap2(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 10, y = 20;
// 值传递调用
swap1(x, y);
printf("值传递交换后:x=%d, y=%d\n", x, y);
// 地址传递调用
swap2(&x, &y);
printf("地址传递交换后:x=%d, y=%d\n", x, y);
return 0;
}
定义函数getMax(int arr[], int n),功能是找出数组中最大值并返回,调用该函数处理数组{18, 5, 27, 9, 33}。
#include
// 找数组最大值函数(数组参数本质是地址传递)
int getMax(int arr[], int n) {
int max = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
int main() {
int numArr[] = {18, 5, 27, 9, 33};
int len = sizeof(numArr) / sizeof(numArr[0]); // 计算数组长度
int maxVal = getMax(numArr, len);
printf("数组最大值:%d\n", maxVal);
return 0;
}
// 错误代码
#include
int multiply(int a, int b) {
return a * b;
}
int main() {
float x = 3.5, y = 2.0;
// 错误1:实参类型不匹配(float→int);错误2:返回值赋值给int,丢失精度
int res = multiply(x, y);
printf("3.5 × 2.0 = %d\n", res);
return 0;
}
// 修正后代码
#include
float multiply(float a, float b) {
return a * b;
}
int main() {
float x = 3.5, y = 2.0;
float res = multiply(x, y);
printf("3.5 × 2.0 = %.1f\n", res);
return 0;
}