1. C函数的基本概念
C语言是一种结构化的编程语言,它可以通过函数的形式来完成各种不同的任务。同样,C函数也是一个由一系列语句组成的代码块,它可以完成特定的任务,并且可以被多次调用。C函数的声明通常包括函数名称、参数列表和返回值类型。
函数的参数列表是指传递给函数的变量或常量列表,而返回值类型可以是任何C语言数据类型。函数的调用实质上是一个表达式,它返回一个值,该值可以被重新分配给一个变量或常量。
//函数声明
int max(int num1, int num2);
//函数定义
int max(int num1, int num2) {
//如果num1大于num2,则返回num1
if (num1 > num2)
return num1;
//否则返回num2
else
return num2;
}
//函数调用
int a = 10, b = 20, result;
result = max(a, b);
2. C函数的参数传递方式
C函数的参数传递可以使用以下三种方式:
2.1 传值调用
传值调用是指将实际参数的值传给函数的形式参数,在函数内部对形式参数的操作不会影响实际参数的值。如果函数需要修改实际参数的值,需要将实际参数的地址作为参数传递给函数。
#include<stdio.h>
void swap(int x, int y);
int main() {
int a = 100, b = 200;
printf("a = %d, b = %d\n", a, b);
swap(a, b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
void swap(int x, int y) {
int temp;
temp = x;
x = y;
y = temp;
}
注意:上述代码执行结果不会改变a和b的值,因为swap函数中的x和y形参是实参a和b值的副本。
2.2 传址调用
传址调用是指将实际参数的地址作为形式参数传递给函数,在函数内部对形式参数的操作会影响实际参数的值。
#include<stdio.h>
void swap(int *x, int *y);
int main() {
int a = 100, b = 200;
printf("a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
void swap(int *x, int *y) {
int temp;
temp = *x;
*x = *y;
*y = temp;
}
2.3 传指针调用
传指针调用是指将实际参数的指针作为形式参数传递给函数,在函数内部通过指针对实际参数进行操作。传指针调用与传址调用类似,但是传指针调用可以很好地支持动态内存分配操作。
#include<stdio.h>
#include<stdlib.h>
void alloc(int **p);
int main() {
int *p = NULL;
alloc(&p);
*p = 100;
printf("*p = %d\n", *p);
free(p);
return 0;
}
void alloc(int **p) {
*p = (int*) malloc(sizeof(int));
}
3. C函数的返回值
C语言函数的返回值可以是任何C语言数据类型,包括void类型。函数的返回值还可以是指针类型、结构体类型、共用体类型等。
3.1 返回值为非void类型的函数
如果一个函数返回值为非void类型,那么它必须使用return语句返回一个指定类型的值。
#include<stdio.h>
int max(int num1, int num2);
int main() {
int a = 100, b = 200, result;
result = max(a, b);
printf("max value is %d\n", result);
return 0;
}
int max(int num1, int num2) {
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
3.2 返回值为指针类型的函数
返回值为指针类型的函数通常被用于动态内存分配和链表等数据结构的操作中。在C语言中,要返回一个指针类型的值,需要在返回类型前加上一个*。
#include<stdio.h>
#include<stdlib.h>
int *allocateArray(int size);
int main() {
int size, *array, i;
printf("input the size of the array:");
scanf("%d", &size);
array = allocateArray(size);
printf("output the elements of the array:");
for (i = 0; i < size; i++) {
printf("%d ", *(array + i));
}
printf("\n");
free(array);
return 0;
}
int *allocateArray(int size) {
int *p = (int*) malloc(size * sizeof(int));
int i;
for (i = 0; i < size; i++) {
*(p + i) = i + 1;
}
return p;
}
3.3 返回值为结构体类型的函数
返回值为结构体类型的函数通常被用于对结构体进行操作,在C语言中,函数的返回类型可以是结构体类型。
#include<stdio.h>
#include<string.h>
struct data {
char name[20];
int age;
};
struct data init_data();
int main() {
struct data d = init_data();
printf("name is %s, age is %d\n", d.name, d.age);
return 0;
}
struct data init_data() {
struct data d;
strcpy(d.name, "weizhan");
d.age = 24;
return d;
}
3.4 返回值为共用体类型的函数
返回值为共用体类型的函数通常被用于对共用体进行操作,在C语言中,函数的返回类型可以是共用体类型。
#include<stdio.h>
#include<string.h>
union data {
char name[20];
int age;
};
union data init_data();
int main() {
union data d = init_data();
printf("name is %s, age is %d\n", d.name, d.age);
return 0;
}
union data init_data() {
union data d;
strcpy(d.name, "weizhan");
d.age = 24;
return d;
}
4. 结论
C函数的参数和返回值是C语言中非常重要的概念,掌握这些知识对于编写高质量的C程序至关重要。在函数的定义和调用中,需要考虑参数的传递方式和返回值类型的设置,以确保程序的正常运行。