C语言使用技巧(十六):完整解析函数返回二维数组的常用技巧(END)

在这里插入图片描述

1、结构体返回一维数组

实现源码:

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

arr farr(int rr[],int len)
{
    
    int i;
    arr re;//定义结构体
    for (i = 0; i < len; i++)
        re.array[i] = rr[i];//使用结构体
    return re;//返回结构体
}
int main()
{
    //arr[4][3] = {{4, 6, -4}, {0, 1, 3}, {7, 9, 11}, {8, -8, 6}};
    int rr[5] = {4, 6, 8, -8, 3};
    int len_arr = sizeof(rr)/sizeof(int);
    int i;
    arr re_nm;
    re_nm = farr(rr, len_arr);//调用函数
    for (i = 0; i < len_arr; i++)
        printf("%lf\n", re_nm.array[i]);
    system("pause");
    return 0;
}

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

2、不需要结构体返回数组方法

从数组中输出数组大小,使用malloc()函数,这里有该函数的用法:《完美解析C语言(char*)malloc(x*sizeof(char))
下面的函数中的max函数不仅能够返回一个数组的最大值,还能够显示这个最大值maxNum在数组中的位置maxIndex。

#include "stdio.h"
#include "stdlib.h"

int *Max(int *arr, int n)
{
    int *a = (int *)malloc(3 * sizeof(int));
    int maxNum = 0, maxIndex, i;
    for (i = 0; i < n; i++)
        if (arr[i] > maxNum)
        {
            maxNum = arr[i];
            maxIndex = i + 1;
        }
    a[0] = maxNum;
    a[1] = maxIndex;
    a[2] = 3;
    return a;
}

void main()
{
    int a[3] = {5, 2, 3}; //a[0]=5,a[1]=2;
    int *b = Max(a, 3);
    int i;
    for (i = 0; i < 3; i++)
        printf("b[%d]=%d\n", i, b[i]);
    system("pause");
    free(b);
}

执行结果;

在这里插入图片描述
下面换一个简单的数组试一试:
实现源码:

#include "stdio.h"
#include "stdlib.h"

int *Max(int *arr, int n)
{
    int i;
    int *a = (int *)malloc(3 * sizeof(int));

    for (i = 0; i < n; i++)
    {
        a[i] = arr[i];
    }
    
    return a;
}

void main()
{
    int a[3] = {5, 2, 3}; //a[0]=5,a[1]=2;
    int *b = Max(a, 3);
    int i;
    for (i = 0; i < 3; i++)
        printf("b[%d]=%d\n", i, b[i]);
    system("pause");
    free(b);
}

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

3、函数返回二维数组

实现源码:

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

char **Function1()
{
    char **Arr = NULL;
    char i = 0, j = 0;
    char Brr[3][3] = {"123", "456", "789"};

    Arr = (char **)malloc(sizeof(char *) * 3);
    for (i = 0; i < 3; i++)
    {
        Arr[i] = (char *)malloc(sizeof(char) * 3);
        for (j = 0; j < 3; j++)
        {
            Arr[i][j] = Brr[i][j];
        }
    }
    return Arr;
}

int main(int argc, const char *argv[])
{
    char **p = NULL;
    int i = 0, j = 0;

    p = Function1();
    printf("Arr[0][0] = %c\n", *(*p));       // 1
    printf("Arr[0][1] = %c\n", *(*(p) + 1)); // 2
    printf("Arr[0][2] = %c\n", *(*(p) + 2)); // 3

    printf("Arr[1][0] = %c\n", *(*(p + 1)));     // 4
    printf("Arr[1][1] = %c\n", *(*(p + 1) + 1)); // 5
    printf("Arr[1][2] = %c\n", *(*(p + 1) + 2)); // 6

    printf("Arr[2][0] = %c\n", *(*(p + 2)));     // 7
    printf("Arr[2][1] = %c\n", *(*(p + 2) + 1)); // 8
    printf("Arr[2][2] = %c\n", *(*(p + 2) + 2)); // 9
                                                 // 将保存每一行的指针先释放掉
    for (i = 0; i < 3; i++)
    {
        if (*(p + i) != NULL)
        {
            free(*(p + i));
            *(p + i) = NULL;
            printf("free *(p + %d) success!!!\n", i);
        }
    }
    // 最后将保存整个二维数组的指针释放掉
    if (p != NULL)
    {
        free(p);
        printf("free p success!!!\n");
    }
    system("pause");
    return 0;
}

执行结果:
在这里插入图片描述
参考文献

下面是参数放置的另一种方法:
数组作为参数放在函数里面,主函数直接调用即可:

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

char **Function1(char Brr[3][3])
{
    char **Arr = NULL;
    char i = 0, j = 0;


    Arr = (char **)malloc(sizeof(char *) * 3);
    for (i = 0; i < 3; i++)
    {
        Arr[i] = (char *)malloc(sizeof(char) * 3);
        for (j = 0; j < 3; j++)
        {
            Arr[i][j] = Brr[i][j];
        }
    }
    return Arr;
}

int main(int argc, const char *argv[])
{
    char **p = NULL;
    int i = 0, j = 0;
    char brr[3][3] = {"123", "456", "789"};

    p = Function1(brr);
    printf("Arr[0][0] = %c\n", *(*p));       // 1
    printf("Arr[0][1] = %c\n", *(*(p) + 1)); // 2
    printf("Arr[0][2] = %c\n", *(*(p) + 2)); // 3

    printf("Arr[1][0] = %c\n", *(*(p + 1)));     // 4
    printf("Arr[1][1] = %c\n", *(*(p + 1) + 1)); // 5
    printf("Arr[1][2] = %c\n", *(*(p + 1) + 2)); // 6

    printf("Arr[2][0] = %c\n", *(*(p + 2)));     // 7
    printf("Arr[2][1] = %c\n", *(*(p + 2) + 1)); // 8
    printf("Arr[2][2] = %c\n", *(*(p + 2) + 2)); // 9
                                                 // 将保存每一行的指针先释放掉
    for (i = 0; i < 3; i++)
    {
        if (*(p + i) != NULL)
        {
            free(*(p + i));
            *(p + i) = NULL;
            printf("free *(p + %d) success!!!\n", i);
        }
    }
    // 最后将保存整个二维数组的指针释放掉
    if (p != NULL)
    {
        free(p);
        printf("free p success!!!\n");
    }
    system("pause");
    return 0;
}

执行结果与上面一样。

4、实现整型二维数组的函数返回

下面更换为整型数据类型来测试该方法的有效性,提升编码的可读性。

实现源码:

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

int **Function1(int Brr[4][3])
{
    int **Arr = NULL;
    int i = 0, j = 0;

    Arr = (int **)malloc(sizeof(int *) * 4);
    for (i = 0; i < 4; i++)
    {
        Arr[i] = (int *)malloc(sizeof(int) * 3);
        for (j = 0; j < 3; j++)
        {
            Arr[i][j] = Brr[i][j];
        }
    }
    return Arr;
}

int main(int argc, const int *argv[])
{
    int **p = NULL;
    int i = 0, j = 0;
    int i0, j0;
    int brr[4][3] = {{4, 6, -4}, {0, 1, 3}, {7, 9, 11}, {8, -8, 6}};

    p = Function1(brr);

    for (i0 = 0; i0 < 4; i0++)
    {
        for (j0 = 0; j0 < 3; j0++)
        {
            printf("Arr[%d][%d] = %d\n", i0, j0, *(*(p + i0) + j0));
        }
    }


    for (i = 0; i < 4; i++)
    {
        if (*(p + i) != NULL)
        {
            free(*(p + i));
            *(p + i) = NULL;
            printf("free *(p + %d) success!!!\n", i);
        }
    }
    // 最后将保存整个二维数组的指针释放掉
    if (p != NULL)
    {
        free(p);
        printf("free p success!!!\n");
    }
    system("pause");
    return 0;
}

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

下列程序返回一个二维数组,求出一个二维数组各行的最大值以及所在位置。

实现源码:

#include "stdio.h"
#include "stdlib.h"

int **Max(int **arr, int n, int m)
{
    int i, j;
    int **data;
    data = (int **)malloc(n * sizeof(int *));
    for (i = 0; i < n; i++)
        data[i] = (int *)malloc(2 * sizeof(int));
    for (i = 0; i < n; ++i)
    {
        int maxNum = 0;
        for (j = 0; j < m; ++j)
        {
            //printf("arr[%d][%d]=%d ",i,j,*((int *)arr+m*i+j));
            if (*((int *)arr + m * i + j) > maxNum)
            {
                maxNum = *((int *)arr + m * i + j);
                data[i][0] = maxNum;
                data[i][1] = j;
            }
        }
        //printf("\n");
    }
    return data;
}

void main()
{
    int i;
    int a[2][3] = {{4, 6, 3}, {9, 7, 1}};
    int **b = Max((int **)a, 2, 3);
    for (i = 0; i < 2; i++)
    {
        printf("the maximum num for row %d is %d\n", i + 1, b[i][0]);
        printf("the maximum num for row %d is in %d", i + 1, b[i][1] + 1);
        printf("\n");
    }
    for (i = 0; i < 2; i++)
        free(b[i]);
    free(b);
    system("pause");
    return 0;
}

执行结果:
在这里插入图片描述
第一维数的最大值是6位置是2,第二维数的最大值是9位置是1.

5、函数的数组参数的多层用法

实现源码:

#include <stdio.h>
//指针导入两个数组参数
void fun(int *p1, int (*p2)[3], int row, int col)
{
    int i, j;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
        {
            printf("数组元素为:%d ", p1[i * col + j]);//输出结果的方式
            p2[j][i] = p1[i * col + j];
        };
        printf("\n");
    };
}
int main()
{
    int a[3][4], b[4][3];
    int i, j;
    for (i = 0; i < 3; i++)
        for (j = 0; j < 4; j++)
            a[i][j] = (i + 1) * 10 + j;
    fun(&a[0][0], &b[0], 3, 4);
    printf("\n");
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 3; j++)
            printf("%d ", b[i][j]);
        printf("\n");
    }
    system("pause");
    return 0;
}

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

6、函数导入二维数组参数实现更改数组元素

实现源码:

#include <stdio.h>
void fun(int (*pIntPtr)[3])
{
    *(*pIntPtr + 0) = 16;       //将a[0][0]改为16
    *(*(pIntPtr + 3) + 1) = 25; //将a[3][1]改为25
}
int main()
{
    int A[4][3] = {{10, 2, 3}, {12, 4, 5}, {14, 7, 8}, {15, 9, 2}};
    int i, j;
    fun(A);
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 3; j++)
            printf("%4d", A[i][j]);
        printf("\n");
    }
    system("pause");
}

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

备注:

函数通过数组作为参数

如果想通过一个一维数组作为函数的参数,就必须声明函数形式参数,使用以下三种方式与所有三个声明方法之一产生类似的结果,因为每一种方式告诉编译器,一个整数指针将会要被接收。类似的方式,可以使用多维数组形式参数。

方式-1:形式参数为指针如下。在下一章将学习什么是指针。

void myFunction(int *param)
{
.
.
.
}

方式-2:如下形式数组参数的大小:

void myFunction(int param[10])
{
.
.
.
}

方式-3:如下形式数组参数作为可变大小:

void myFunction(int param[])
{
.
.
.
}
  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源代码杀手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值