C语言的函数通过return语句将执行结果返回给调用方,调用方需要定义和返回值类型匹配的变量来存储这个结果,这就是接收返回值的基本逻辑。不同类型的返回值对应不同的接收方式,下面会逐一讲解。

一、基本返回值接收方式
当函数返回普通数据类型(比如int、float、char等)时,直接定义同类型的变量,把函数调用语句赋值给这个变量即可完成接收。
下面是一个返回两个整数的和的函数示例:
#include <stdio.h>
// 定义返回int类型的函数,计算两个数的和
int add(int a, int b) {
return a + b; // 通过return返回计算结果
}
int main() {
int result; // 定义int类型变量,和函数返回值类型匹配
result = add(3, 5); // 调用函数,将返回值赋值给result变量
printf("两数之和为:%dn", result);
return 0;
}
上面的代码中,add函数的返回值是int类型,main函数中定义的result也是int类型,直接通过赋值操作就能接收返回值,最终输出结果为8。
二、忽略不需要的返回值
如果调用函数后不需要使用它的返回值,可以直接调用函数而不进行赋值,此时返回值会被自动忽略。
比如下面的示例,print_hello函数返回int类型,但我们不需要使用这个返回值:
#include <stdio.h>
int print_hello() {
printf("Hello Worldn");
return 0; // 返回0表示执行成功
}
int main() {
print_hello(); // 直接调用函数,忽略返回值
return 0;
}
三、接收指针类型的返回值
如果函数返回的是指针类型(比如返回数组首地址、动态内存地址等),需要用对应类型的指针变量来接收。
下面是一个返回动态分配内存地址的示例:
#include <stdio.h>
#include <stdlib.h>
// 返回int类型指针的函数,分配一个int大小的内存并返回地址
int* create_int() {
int* p = (int*)malloc(sizeof(int));
*p = 10;
return p; // 返回指针
}
int main() {
int* num_ptr; // 定义int类型指针变量
num_ptr = create_int(); // 接收返回的指针
printf("动态分配的值为:%dn", *num_ptr);
free(num_ptr); // 释放动态内存
return 0;
}
四、接收返回值的注意事项
- 接收变量的数据类型必须和函数返回值类型匹配,否则可能出现数据截断或者编译警告。比如函数返回double类型,用int变量接收会丢失小数部分。
- 不要接收局部变量的地址作为返回值,因为局部变量在函数执行结束后会被销毁,返回的地址指向的内容是不确定的,属于未定义行为。
- 如果返回值是void类型,说明函数没有返回值,此时不需要也不能接收返回值,否则会编译报错。
下面是一个类型不匹配的错误示例,大家可以注意避免:
#include <stdio.h>
float get_pi() {
return 3.14159f; // 返回float类型
}
int main() {
int pi_val;
pi_val = get_pi(); // 用int接收float返回值,会丢失小数部分
printf("pi的值为:%dn", pi_val); // 输出结果为3
return 0;
}
五、常见问题解答
1. 函数可以返回多个值吗?
C语言的函数只能直接返回一个值,如果需要返回多个结果,可以通过指针参数间接返回,或者返回结构体类型。
下面是通过指针参数返回多个值的示例:
#include <stdio.h>
// 通过指针参数返回两个数的和与差
void calc(int a, int b, int* sum, int* diff) {
*sum = a + b;
*diff = a - b;
}
int main() {
int s, d;
calc(10, 3, &s, &d);
printf("和为:%d,差为:%dn", s, d);
return 0;
}
2. return语句后面可以没有返回值吗?
如果函数定义时返回值类型不是void,那么return语句后面必须跟对应类型的返回值,否则会编译报错。如果返回值类型是void,return后面可以不跟内容,或者直接省略return语句。