Linux环境下的C语言编程(十七)
前言
本文作为一个学习C语言学习笔记,记录 【史上最强最细腻的linux嵌入式C语言学习教程【李慧芹老师】-哔哩x课程笔记和自己的困惑之处。请各位大佬指出我的不足之处,更好的促进我的成长。
函数三种参数传递方式
1. 值传递
特点:传递参数的副本,函数内修改不影响原变量
#include <stdio.h>void swapByValue(int a, int b) {int temp = a;a = b;b = temp;printf("函数内 - a = %d, b = %d\n", a, b);
}// 计算平方的函数
int square(int num) {return num * num;
}int main() {int x = 5, y = 10;printf("交换前 - x = %d, y = %d\n", x, y);swapByValue(x, y);printf("交换后 - x = %d, y = %d\n", x, y); // x,y的值不变return 0;
}
运行结果:
交换前 - x = 5, y = 10
函数内 - a = 10, b = 5
交换后 - x = 5, y = 10
2. 地址传递
特点:传递变量的地址,函数内修改会影响原变量
#include <stdio.h>//交换两个变量的值函数
void swapByAddress(int *a, int *b) {int temp = *a;*a = *b;*b = temp;printf("函数内 - *a = %d, *b = %d\n", *a, *b);
}// 修改数组元素的函数
void modifyArray(int arr[], int size) {for(int i = 0; i < size; i++) {arr[i] = arr[i] * 2; // 每个元素乘以2}
}// 打印数组的函数
void printArray(int arr[], int size) {for(int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int x = 5, y = 10;printf("交换前 - x = %d, y = %d\n", x, y);swapByAddress(&x, &y); // 传递地址printf("交换后 - x = %d, y = %d\n", x, y); // x,y的值被交换// 数组示例(数组名本身就是地址)int numbers[] = {1, 2, 3, 4, 5};int length = 5;printf("修改前数组: ");printArray(numbers, length);modifyArray(numbers, length); // 注:数组名就是地址!printf("修改后数组: ");printArray(numbers, length);return 0;
}
运行结果:
交换前 - x = 5, y = 10
函数内 - *a = 10, *b = 5
交换后 - x = 10, y = 5
修改前数组: 1 2 3 4 5
修改后数组: 2 4 6 8 10
3. 全局变量(一般不使用)
特点:在所有函数外部定义的变量,任何函数都可以访问
#include <stdio.h>// 全局变量
int globalCounter = 0;// 使用全局变量的函数
void incrementCounter() {globalCounter++;printf("计数器增加: %d\n", globalCounter);
}void resetCounter() {globalCounter = 0;printf("计数器重置: %d\n", globalCounter);
}// 另一个全局变量示例
double PI = 3.14159;double calculateCircleArea(double radius) {return PI * radius * radius;
}double calculateCircleCircumference(double radius) {return 2 * PI * radius;
}int main() {// 使用计数器函数incrementCounter();incrementCounter();incrementCounter();resetCounter();incrementCounter();// 使用PI计算double r = 5.0;printf("半径为%.1f的圆:\n", r);printf("面积: %.2f\n", calculateCircleArea(r));printf("周长: %.2f\n", calculateCircleCircumference(r));return 0;
}
运行结果:
计数器增加: 1
计数器增加: 2
计数器增加: 3
计数器重置: 0
计数器增加: 1
半径为5.0的圆:
面积: 78.54
周长: 31.42
三种参数传递方式对比
| 传递方式 | 特点 | 适用场景 | 注意事项 |
|---|---|---|---|
| 值传递 | 传递副本,原值不变 | 不需要修改原数据的情况 | 大型结构体可能影响性能 |
| 地址传递 | 传递地址,可修改原值 | 需要修改原数据或传递大型数据 | 需要掌握指针,注意空指针 |
| 全局变量 | 所有函数可访问 | 程序全局共享的数据 | 谨慎使用 |
选择建议:
-
简单数据、不需要修改:使用值传递
-
需要修改原数据或传递数组:使用地址传递
-
真正全局共享的数据:考虑使用全局变量
