- C语言编程教程
- C语言 - 首页
- C语言基础
- C语言 - 概述
- C语言 - 特性
- C语言 - 历史
- C语言 - 环境搭建
- C语言 - 程序结构
- C语言 - Hello World
- C语言 - 编译过程
- C语言 - 注释
- C语言 - 词法单元
- C语言 - 关键字
- C语言 - 标识符
- C语言 - 用户输入
- C语言 - 基本语法
- C语言 - 数据类型
- C语言 - 变量
- C语言 - 整数提升
- C语言 - 类型转换
- C语言 - 类型强制转换
- C语言 - 布尔值
- C语言中的常量和字面量
- C语言 - 常量
- C语言 - 字面量
- C语言 - 转义序列
- C语言 - 格式说明符
- C语言中的运算符
- C语言 - 运算符
- C语言 - 算术运算符
- C语言 - 关系运算符
- C语言 - 逻辑运算符
- C语言 - 位运算符
- C语言 - 赋值运算符
- C语言 - 一元运算符
- C语言 - 自增和自减运算符
- C语言 - 三元运算符
- C语言 - sizeof 运算符
- C语言 - 运算符优先级
- C语言 - 其他运算符
- C语言中的决策语句
- C语言 - 决策语句
- C语言 - if 语句
- C语言 - if...else 语句
- C语言 - 嵌套 if 语句
- C语言 - switch 语句
- C语言 - 嵌套 switch 语句
- C语言中的循环
- C语言 - 循环
- C语言 - while 循环
- C语言 - for 循环
- C语言 - do...while 循环
- C语言 - 嵌套循环
- C语言 - 无限循环
- C语言 - break 语句
- C语言 - continue 语句
- C语言 - goto 语句
- C语言中的函数
- C语言 - 函数
- C语言 - 主函数
- C语言 - 按值调用函数
- C语言 - 按引用调用函数
- C语言 - 嵌套函数
- C语言 - 可变参数函数
- C语言 - 用户自定义函数
- C语言 - 回调函数
- C语言 - 返回语句
- C语言 - 递归
- C语言中的作用域规则
- C语言 - 作用域规则
- C语言 - 静态变量
- C语言 - 全局变量
- C语言中的数组
- C语言 - 数组
- C语言 - 数组的特性
- C语言 - 多维数组
- C语言 - 将数组传递给函数
- C语言 - 从函数返回数组
- C语言 - 变长数组
- C语言中的指针
- C语言 - 指针
- C语言 - 指针和数组
- C语言 - 指针的应用
- C语言 - 指针运算
- C语言 - 指针数组
- C语言 - 指向指针的指针
- C语言 - 将指针传递给函数
- C语言 - 从函数返回指针
- C语言 - 函数指针
- C语言 - 指向数组的指针
- C语言 - 指向结构体的指针
- C语言 - 指针链
- C语言 - 指针与数组的区别
- C语言 - 字符指针和函数
- C语言 - NULL 指针
- C语言 - void 指针
- C语言 - 悬空指针
- C语言 - 解引用指针
- C语言 - 近、远和巨型指针
- C语言 - 指针数组的初始化
- C语言 - 指针与多维数组的区别
- C语言中的字符串
- C语言 - 字符串
- C语言 - 字符串数组
- C语言 - 特殊字符
- C语言中的结构体和联合体
- C语言 - 结构体
- C语言 - 结构体和函数
- C语言 - 结构体数组
- C语言 - 自引用结构体
- C语言 - 查找表
- C语言 - 点(.)运算符
- C语言 - 枚举(或 enum)
- C语言 - 结构体填充和压缩
- C语言 - 嵌套结构体
- C语言 - 匿名结构体和联合体
- C语言 - 联合体
- C语言 - 位域
- C语言 - Typedef
- C语言中的文件处理
- C语言 - 输入与输出
- C语言 - 文件I/O(文件处理)
- C语言预处理器
- C语言 - 预处理器
- C语言 - 编译指示
- C语言 - 预处理器运算符
- C语言 - 宏
- C语言 - 头文件
- C语言中的内存管理
- C语言 - 内存管理
- C语言 - 内存地址
- C语言 - 存储类别
- 其他主题
- C语言 - 错误处理
- C语言 - 可变参数
- C语言 - 命令执行
- C语言 - 数学函数
- C语言 - static 关键字
- C语言 - 随机数生成
- C语言 - 命令行参数
- C语言编程资源
- C语言 - 问答
- C语言 - 快速指南
- C语言 - 速查表
- C语言 - 有用资源
- C语言 - 讨论
C语言函数中返回指针
在C语言编程中,一个函数可以定义为有多个参数,但它只能向调用函数返回一个表达式。
一个函数可以返回单个值,该值可以是任何类型的变量,例如基本类型(如int、float、char等)、指向基本类型或用户定义类型变量的指针,或者指向任何变量的指针。
阅读本章,了解C程序中函数返回指针的不同方法。
从C语言函数中返回静态数组
如果函数具有局部变量或局部数组,则返回局部变量的指针是不可接受的,因为它指向一个不再存在的变量。请注意,局部变量一旦函数作用域结束就将不复存在。
示例1
下面的示例演示了如何在被调用函数(arrfunction)内使用静态数组并将它的指针返回给main()函数。
#include <stdio.h>
#include <math.h>
float * arrfunction(int);
int main(){
int x = 100, i;
float *arr = arrfunction(x);
printf("Square of %d: %f\n", x, *arr);
printf("Cube of %d: %f\n", x, arr[1]);
printf("Square root of %d: %f\n", x, arr[2]);
return 0;
}
float *arrfunction(int x){
static float arr[3];
arr[0] = pow(x,2);
arr[1] = pow(x, 3);
arr[2] = pow(x, 0.5);
return arr;
}
输出
运行此代码时,将产生以下输出:
Square of 100: 10000.000000 Cube of 100: 1000000.000000 Square root of 100: 10.000000
示例2
现在考虑以下函数,它将生成10个随机数。它们存储在一个静态数组中,并将它们的指针返回给main()函数。然后,在main()函数中遍历该数组,如下所示:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
/* function to generate and return random numbers */
int *getRandom() {
static int r[10];
srand((unsigned)time(NULL)); /* set the seed */
for(int i = 0; i < 10; ++i){
r[i] = rand();
}
return r;
}
int main(){
int *p; /* a pointer to an int */
p = getRandom();
for(int i = 0; i < 10; i++) {
printf("*(p + %d): %d\n", i, *(p + i));
}
return 0;
}
输出
运行代码并检查其输出:
*(p + 0): 776161014 *(p + 1): 80783871 *(p + 2): 135562290 *(p + 3): 697080154 *(p + 4): 2064569097 *(p + 5): 1933176747 *(p + 6): 653917193 *(p + 7): 2142653666 *(p + 8): 1257588074 *(p + 9): 1257936184
从C语言函数中返回字符串
使用相同的方法,您可以将字符串传递给函数并从函数返回字符串。C语言中的字符串是char类型的数组。在下面的示例中,我们使用指针传递字符串,在函数中操作它,然后将其返回给main()函数。
示例
在被调用函数中,我们使用malloc()函数分配内存。传递的字符串在返回之前与局部字符串连接。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *hellomsg(char *);
int main(){
char *name = "TutorialsPoint";
char *arr = hellomsg(name);
printf("%s\n", arr);
return 0;
}
char *hellomsg(char *x){
char *arr = (char *)malloc(50*sizeof(char));
strcpy(arr, "Hello ");
strcat(arr, x);
return arr;
}
输出
运行代码并检查其输出:
Hello TutorialsPoint
从C语言函数中返回结构体指针
下面的示例演示了如何返回struct类型变量的指针。
这里,area()函数有两个按值传递的参数。main()函数从用户读取长度和宽度,并将它们传递给area()函数,area()函数填充一个struct变量并将它的引用(指针)返回给main()函数。
示例
查看程序:
#include <stdio.h>
#include <string.h>
struct rectangle{
float len, brd;
double area;
};
struct rectangle * area(float x, float y);
int main(){
struct rectangle *r;
float x, y;
x = 10.5, y = 20.5;
r = area(x, y);
printf("Length: %f \nBreadth: %f \nArea: %lf\n", r->len, r->brd, r->area);
return 0;
}
struct rectangle * area(float x, float y){
double area = (double)(x*y);
static struct rectangle r;
r.len = x; r.brd = y; r.area = area;
return &r;
}
输出
运行此代码时,将产生以下输出:
Length: 10.500000 Breadth: 20.500000 Area: 215.250000
广告