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