在C语言中,函数返回值的类型是由 函数定义时在函数名前声明的返回类型 决定的。

(图片来源网络,侵删)
这是一个核心且必须遵守的规则,下面我们来详细解释和举例说明。
核心规则
- 声明位置:函数的返回类型是在函数定义的头部声明的,它位于函数名的前面。
- 作用:这个声明告诉编译器,当这个函数执行完毕后,它会返回一个什么类型的数据(例如一个整数、一个浮点数、一个字符、一个指针,或者不返回任何值)。
- 一致性:函数内部
return语句所返回的值,其类型必须与函数声明中指定的返回类型兼容,如果不兼容,编译器会发出警告或错误。
详细说明与示例
基本数据类型
这是最常见的情况,函数返回一个基本数据类型的值。
#include <stdio.h>
// 1. 函数声明和定义
// 这里的 "int" 就是返回值的类型
// 它决定了这个函数将返回一个整数
int add(int a, int b) {
int result = a + b;
// return 语句返回的值 (result) 是一个 int 类型,
// 与函数声明的返回类型 "int" 匹配
return result;
}
// 2. 另一个例子
// 这里的 "double" 是返回值的类型
// 它决定了这个函数将返回一个双精度浮点数
double get_average(int sum, int count) {
// count 为 0,这里会发生除以零的错误。
// 为了演示,我们暂时忽略这个细节。
return (double)sum / count;
}
int main() {
int x = 10;
int y = 20;
// 调用 add 函数,它的返回值 (一个 int) 被赋值给变量 sum
int sum = add(x, y);
printf("The sum is: %d\n", sum); // 输出: The sum is: 30
// 调用 get_average 函数,它的返回值 (一个 double) 被赋值给变量 avg
double avg = get_average(sum, 2);
printf("The average is: %f\n", avg); // 输出: The average is: 15.000000
return 0; // main 函数的返回类型是 int,所以这里返回一个整数 0
}
分析:
int add(...):add函数返回类型是int。double get_average(...):get_average函数返回类型是double。int main():main函数的返回类型是int,这是标准规定。
指针类型
函数也可以返回一个内存地址(指针)。

(图片来源网络,侵删)
#include <stdio.h>
#include <stdlib.h>
// 函数返回一个指向整型的指针 (int*)
int* create_and_set_value(int value) {
// 在堆上分配内存
int* ptr = (int*)malloc(sizeof(int));
if (ptr != NULL) {
*ptr = value;
}
// 返回的是指向整型的指针,与声明的返回类型 int* 匹配
return ptr;
}
int main() {
int* my_number = create_and_set_value(100);
if (my_number != NULL) {
printf("The value is: %d\n", *my_number); // 输出: The value is: 100
free(my_number); // 记得释放内存
}
return 0;
}
分析:
int* create_and_set_value(...):这个函数的返回类型是指向int的指针int*。- 函数内部
return ptr;返回的ptr正是一个int*类型的指针,类型匹配。
无返回值 (void)
如果函数不需要返回任何值,那么它的返回类型必须声明为 void。
#include <stdio.h>
// 函数返回类型是 void,表示不返回任何值
void print_greeting(const char* name) {
printf("Hello, %s!\n", name);
// 在 void 函数中,可以使用 return; 来提前结束函数,
// 但不能返回一个值,"return 123;" 是错误的。
return; // 这是可选的,通常用于提前退出函数
}
int main() {
// 调用 print_greeting 函数,它只是执行打印操作,不返回值
print_greeting("Alice");
print_greeting("Bob");
// 试图接收一个 void 函数的返回值是错误的
// int result = print_greeting("Charlie"); // 编译错误!
return 0;
}
分析:
void print_greeting(...):print_greeting函数的返回类型是void,明确表示它不执行任何返回操作。- 在
void函数中使用return;是可以的,但return后面不能跟任何值。
结构体或联合体类型
函数也可以返回一个复杂的数据结构,如结构体。

(图片来源网络,侵删)
#include <stdio.h>
// 定义一个结构体
typedef struct {
int x;
int y;
} Point;
// 函数返回一个 Point 结构体
Point create_point(int x, int y) {
Point p;
p.x = x;
p.y = y;
// 返回一个 Point 类型的结构体
return p;
}
int main() {
Point my_point = create_point(10, 20);
printf("Point coordinates: (%d, %d)\n", my_point.x, my_point.y);
return 0;
}
分析:
Point create_point(...):create_point函数的返回类型是我们自定义的Point结构体。
常见错误与注意事项
-
返回类型不匹配
return语句的值与函数声明的返回类型不兼容,编译器会报错。int get_number() { // 错误:函数声明返回 int,但试图返回一个 double 字面量 // 在某些宽松的编译器下可能只会产生警告,但这是不好的实践 return 3.14; }正确做法:进行类型转换。
int get_number() { // 正确:将 double 强制转换为 int return (int)3.14; // 返回 3 } -
忘记
return语句 如果一个非void函数的所有执行路径都没有return语句,它将返回一个未定义的垃圾值。int get_status() { int status = 1; if (some_condition) { return status; // 只在某个条件下返回 } // some_condition 为假,函数会在这里 "掉下去", // 返回一个随机的、未初始化的值。 }正确做法:确保所有路径都有
return。int get_status() { int status = 1; if (some_condition) { return status; } return 0; // 提供一个默认的返回值 }
记住这个关键点:
在C语言中,函数返回值的类型,是在函数定义时,函数名前面声明的那个类型。
这个声明是函数与调用者之间的一个契约,它规定了函数“产出”的是什么类型的数据。
