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 - Main 函数 C - 按值调用函数 C - 按引用调用函数 C - 嵌套函数 C - 可变参数函数 C - 用户定义函数 C - 回调函数 C - return 语句 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 - 指针 vs 数组 C - 字符指针和函数 C - NULL 指针 C - void 指针 C - 悬垂指针 C - 解引用指针 C - Near、Far 和 Huge 指针 C - 指针数组的初始化 C - 指针与多维数组

C 语言中的字符串

C - 字符串 C - 字符串数组 C - 特殊字符

C 语言的结构体和联合

C - 结构体 C - 结构体和函数 C - 结构体数组 C - 自引用结构 C - 查找表 C - 点 (.) 运算符 C - 枚举(或 enum) C - 结构填充和打包 C - 嵌套结构 C - 匿名结构和联合 C - 联合 C - Bit 位字段 C - Typedef

C 语言中的文件处理

C - 输入和输出 C - 文件 I/O(文件处理)

C 语言中的预处理器

C - 预处理器 C - #pragma 编译指示 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 语言函数返回静态数组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
", x, *arr);
   printf("Cube of %d: %f
", x, arr[1]);
   printf("Square root of %d: %f
", 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>

/* 用于生成和返回随机数的函数 */
int *getRandom() {
    static int r[10];
    srand((unsigned)time(NULL));/* 设置种子 */
  
   for(int i = 0; i < 10; ++i){
      r[i] = rand();
   }
    
   return r;
}

int main(){

   int *p;     /* 指向 int 的指针 */
   p = getRandom();

   for(int i = 0; i < 10; i++) {
      printf("*(p + %d): %d
", 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
", 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 语言中从函数返回结构体指针

以下示例展示了如何将指针返回到结构体类型的变量。

此处,area() 函数有两个按值调用参数。main() 函数从用户那里读取长度和宽度,并将它们传递给 area() 函数,该函数填充一个结构体变量,并将其引用(指针)传递回 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 
Breadth: %f 
Area: %lf
", 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