参数的传递
值传递(传递数据副本)
特点:形参是实参的副本,函数内修改形参不会影响实参。
示例 1:基本数据类型的值传递
#include <stdio.h>
void increment(int a) {
a += 1; // 修改形参的值
}
int main() {
int x = 10;
increment(x);
printf("x = %d\n", x); // 输出仍为 10
return 0;
}
示例 2:结构体传递
#include <stdio.h>
typedef struct { int x; int y; } Point;
void move_point(Point p) {
p.x += 5; // 修改形参结构体的成员
}
int main() {
Point pt = {10, 20};
move_point(pt);
printf("移动后: x=%d, y=%d\n", pt.x, pt.y); // 输出仍为 10, 20
return 0;
}
指针传递(传递内存地址)
示例 1:交换变量值
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 3, y = 5;
swap(&x, &y);
printf("交换后: x=%d, y=%d\n", x, y); // 输出发生改变,为 5, 3
return 0;
}
示例 2:修改结构体成员
#include <stdio.h>
typedef struct { int x; int y; } Point;
void move_point_ptr(Point *p) {
p->x += 5; // 直接修改实参结构体的成员
}
int main() {
Point pt = {10, 20};
move_point_ptr(&pt);
printf("移动后: x=%d, y=%d\n", pt.x, pt.y); // 输出 15, 20
return 0;
}
数组的传递
数组的传递有一些特殊情况需要注意,因此单独列出
通过指针传递数组
这是最常用的方法,因为数组名本质上是指向数组首元素的指针。
实现方式:
- 函数参数声明为指针形式(如 int *arr 或 int arr[])。
- 传递数组名时,实际传递的是数组首地址,函数内通过指针操作数组元素。
void processArray(int *arr, int size) {
for (int i = 0; i < size; i++) {
arr[i] *= 2;
}
}
//语法糖,等价于上面
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
}
// 调用时:processArray(myArray, size);
传递固定大小的数组
在函数参数中显式指定数组大小(如 int arr[5]),但实际仍以指针形式处理。
void printFixedArray(int arr[5]) {
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
}
多维数组传递
需在函数参数中明确指定除第一维外的其他维度大小。
void process2DArray(int arr[][3], int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 3; j++) {
arr[i][j] *= 2;
}
}
}