Cprogramming 简明教程

Return a Pointer from a Function in C

C programming 中,可以将函数定义为具有多个参数,但它只能将一个表达式返回给调用函数。

function 可以返回单个值,该值可以是 variable 的任何类型,无论是基元类型(如 int、float、char 等)、指针到基元类型或用户定义类型的变量,或者指针到任何变量。

阅读本章以了解 C 程序中的函数如何通过不同方式返回指针。

Return a Static Array from a Function in C

如果函数有局部变量或局部 array ,那么返回局部变量的 pointer 是不可接受的,因为它指向不再存在的变量。请注意,局部变量会在函数作用域结束时立即停止存在。

Example 1

以下示例显示了如何在所调函数 (arrfunction) 中使用 static array ,并将其指针返回给 main() function

#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

Example 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

Return a String from a Function in C

使用相同的方法,可以将 string 传递给函数并从函数返回。C 中的字符串是 char 类型的数组。在以下示例中,我们使用指针传递字符串,在函数内部操作它,并将其返回到 main() 函数。

Example

在被调用的函数的内部,我们使用 malloc() function 分配内存。通过的字符串在返回前会与本地字符串连接。

#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

Return a Struct Pointer from a Function in C

以下示例展示了如何返回指向 struct type 变量的指针。

此处,area() 函数有 2 个按值传递的参数。main() 函数从用户读取长度和宽度并将其传递给 area() 函数,该函数会填充一个结构变量并将其引用(指针)返回给 main() 函数。

Example

看一下这个程序 −

#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