1. C语言中函数调用的方式
C语言作为一种结构化的程序设计语言,其函数调用是比较常见的操作。在C语言中,函数调用有多种方式,包括以下几种:
1.1 值传递
值传递是指在函数调用时,将实参的值复制一份传递给形参,在函数内部对形参的操作不会影响实参的值。
void swap(int a, int b){
int temp = a;
a = b;
b = temp;
}
int main(){
int x = 1, y = 2;
swap(x, y);
printf("x=%d, y=%d", x, y); // 输出结果为:x=1, y=2
return 0;
}
在上面的代码中,我们定义了一个swap()函数,并在main()函数中调用该函数来交换变量x和y的值。由于采用的是值传递的方式,因此函数内部对形参a和b的操作并不会影响到实参x和y的值。
1.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("x=%d, y=%d", x, y); // 输出结果为:x=2, y=1
return 0;
}
在上面的代码中,我们将变量x和y的地址传递给swap()函数中的形参a和b。在函数内部,通过指针对实参进行操作,因此可以直接修改实参的值。
1.3 数组传递
数组传递是将数组的地址作为实参传递给形参,在函数内部对数组进行操作。
void print(int arr[], int len){
for(int i = 0; i < len; i++){
printf("%d ", arr[i]);
}
}
int main(){
int arr[] = {1, 2, 3, 4, 5};
print(arr, 5); // 输出结果为:1 2 3 4 5
return 0;
}
在上面的代码中,我们定义了一个print()函数,并将数组arr的地址和数组的长度作为实参传递给该函数。在函数内部,我们通过数组名和下标对数组元素进行访问,达到打印数组元素的目的。
1.4 结构体传递
结构体传递是将结构体的地址作为实参传递给形参,在函数内部对结构体进行操作。
struct student{
int id;
char name[20];
float score;
};
void print(struct student *p){
printf("id:%d, name:%s, score:%.2f\n", p->id, p->name, p->score);
}
int main(){
struct student s = {1001, "Tom", 89.5};
print(&s); // 输出结果为:id:1001, name:Tom, score:89.50
return 0;
}
在上面的代码中,我们定义了一个结构体student,并定义了一个print()函数,通过指针对结构体成员进行访问,打印结构体的值。
1.5 函数指针传递
函数指针传递是将一个函数的地址作为实参传递给形参,在函数内部通过该函数指针调用函数。
int add(int a, int b){
return a + b;
}
int sub(int a, int b){
return a - b;
}
void calculate(int (*p)(int, int)){
int result = p(4, 5);
printf("result=%d\n", result);
}
int main(){
calculate(add); // 输出结果为:result=9
calculate(sub); // 输出结果为:result=-1
return 0;
}
在上面的代码中,我们定义了两个函数add()和sub(),这两个函数都接收两个整数参数,并返回一个整数。接着我们定义了一个calculate()函数,该函数接收一个函数指针作为参数,并通过该函数指针调用函数。在main()函数中,我们分别调用calculate()函数,并将add()和sub()函数的地址作为实参传递给该函数。