zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C语言使用技巧(十五):函数返回数组和带有数组的链表结构体

C语言链表数组 函数 技巧 结构 返回 十五
2023-09-14 09:09:14 时间

在这里插入图片描述

1、随机生成数组并返回指针数组

该资料引用:参考文献1:C函数返回数组
C 语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。

实现源码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* 要生成和返回随机数的函数 */
int *getRandom()           //别忘了加上指针“*”
{
    static int r[10];
    int i;

    /* 设置种子 */
    srand((unsigned)time(NULL));
    for (i = 0; i < 10; ++i)
    {
        r[i] = rand();
        printf("r[%d] = %d\n", i, r[i]);
    }

    return r;//返回时只需“r”即可
}

/* 要调用上面定义函数的主函数 */
int main()
{
    /* 一个指向整数的指针 */
    int *p; 
    int i;

    p = getRandom();
    for (i = 0; i < 10; i++)
    {
        printf("*(p + %d) : %d\n", i, *(p + i)); 
        //调用时别忘了加上指针“*”
    }
    system("pause");
    return 0;
}

实现结果:

在这里插入图片描述

2、形参传入数组

备注:事实上,函数里有数组参数,其实传递的是指针。

比如你函数声明为:

void fun(int a[4]);

你在main函数中可以这样调用:

int b[4] = {5,7,1,2};
fun(b);        //你可以这样调用

此外, 一般而言,局部变量在函数调用完之后,所占用内存空间就会被释放,如 int a[maxsize];但,如果用 static之后,变量就会存储在静态存储区,函数调用完之后,并不会释放.还有一种

int *a;
a=(int*)malloc(maxsize); 

这种动态分配存储空间,函数在调用完之后,也不会释放,除非程序结束,或主动释放。

#include <stdio.h>

int *ff()
{
    int i;
    static int a[10];

    for (i = 0; i < 10; i++)
        a[i] = 2*i + i*(i+1)*i -(i+1)*(i+1);
    return a;
}

int main()
{
    int i;
    int *a;
    a = ff();
    for (i = 0; i < 10; i++)
        printf("%d\n", a[i]);
    system("pause");
    return 0;
}

执行结果:
在这里插入图片描述

3、使用结构体函数返回数组

实现源码:

#include <stdio.h>
#include <math.h>
//结构体返回数组
typedef struct arr
{
    double a[10];
} arr;

arr farr()
{
    int i;
    arr a;//定义结构体
    for (i = 0; i < 10; i++)
        a.a[i] = i*i + sin(i+1);//使用结构体
    return a;//返回结构体
}
int main()
{
    int i;
    arr a;
    a = farr();//调用函数
    for (i = 0; i < 10; i++)
        printf("%lf\n", a.a[i]);
    system("pause");
    return 0;
}

执行结果:

在这里插入图片描述

4、函数返回多维数组

实现源码:

#include <stdio.h>
//返回多维数组
int (*fun(int b[][2]))[2]
{
    return b;
}

int main()
{
    int i, j;
    int a[2][2] = {1, 2, 5, 6};
    int(*c)[2];
    c = fun(a);
    for (i = 0; i < 2; i++)
        for (j = 0; j < 2; j++)
            printf("%d ", c[i][j]);
    system("pause");
    return 0;
}

5、共用结构体数组的返回

源码实现:


#include <stdio.h>
#include <stdlib.h>
typedef struct _fenshu
{
    int fenzi;
    int fenmu;
}fenshu;
fenshu *add(fenshu *a, fenshu *b)
{
    fenshu *s = (fenshu *)malloc(sizeof(fenshu));
    s->fenmu = a->fenmu * b->fenmu;
    s->fenzi = a->fenmu * b->fenzi + a->fenzi * b->fenmu;
    return s;
};
fenshu *mul(fenshu *a, fenshu *b)
{
    fenshu *s = (fenshu *)malloc(sizeof(fenshu));
    s->fenmu = a->fenmu * b->fenmu;
    s->fenzi = a->fenzi * b->fenzi;
    return s;
}

int main()

{
    fenshu a = {1, 2};
    fenshu b = {2, 5};
    fenshu *s;
    s = mul(&a, &b);
    printf("%d %d\n", s->fenmu, s->fenzi);
    free(s);
    system("pause");
    return 0;
}

参考文献