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[])
{
.
.
.
}