函数的参数和返回值为数组和函数

函数的参数和返回值

前言

下面的知识有可能会用到:
int 名称 = new int[大小]-动态申请数组

函数的参数是数组

数组要想在函数中传递,必须以指针的方式进行,我们必须知道开始地址和长度或是开始地址和结束地址。

一维数组

#include <bits/stdc++.h>
using namespace std;
void Print(int *a, int len, string sep)
{
	for (int *i = a; i <= a + (len - 1); i++)
	{
		cout << *i << sep;
	}
}
int main()
{
	int a[10] = {1, 2, 3, 4 ,5 ,6 , 7, 8, 9, 10};
	Print(a, 10, " ");
	return 0;
}
编译成功
1 2 3 4 5 6 7 8 9 10

代码运行结束

如果选的是开始地址和结束地址,无异于是把a + len改到了函数外。

#include <bits/stdc++.h>
using namespace std;
void Print(int *a, int *b, string sep)
{
	for (int *i = a; i <= b; i++)
	{
		cout << *i << sep;
	}
}
int main()
{
	int a[10] = {1, 2, 3, 4 ,5 ,6 , 7, 8, 9, 10};
	Print(a, a + 9, " ");
	return 0;
}
编译成功
1 2 3 4 5 6 7 8 9 10

代码运行结束

大家怎么用就看代码怎么在实战中更方便,时间复杂度都是O(n)

二维数组

二维数组也差不多哈,时间复杂度一看就是O(n2)。

#include <bits/stdc++.h>
using namespace std;
void Print(int *a, int l1, int l2, string s1, string s2)
{
	for (int *i = a; i <= a + (l1 - 1) * l2; i += l2)
	{
		for (int *j = i; j <= i + (l2 - 1); j++)
		{
			cout << *j << sep;
		}
		cout << endline;
	}
}
int main()
{
	int a[2][10] = {
		{1, 2, 3, 4 ,5 ,6 , 7, 8, 9, 10},
		{1, 2, 3, 4 ,5 ,6 , 7, 8, 9, 10}};
	Print(&a[0][0], 2, 10, " ", "\n");
	return 0;
}
编译成功
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10

代码运行结束

函数的返回值是数组

这个还算复杂啊,用到了前面的new申请空间,还是有点费脑子。

一维数组

#include <bits/stdc++.h>
using namespace std;
int *create(int len)
{
	int a = new int[len];
	for (int i = 0; i < len; i++)
	{
		// 设置
		a[i] = i;
	}
	return a;
}
int main()
{
	const int a = 10;
	int l[a] = create(a);
	cout <<< l[0] << l[2] << endl;
	return 0;
}
编译成功
02

代码运行结束

但是这样不仅麻烦,主程序还得知道数组有多长,所以我用了另一种方法,虽然函数里麻烦,但主程序还挺简单的,另外如果不知道长度,这样也能知道。
方法
我觉得代码可以这样写啊:

#include <bits/stdc++.h>
using namespace std;
int *create()
{
	int a = new int[10010];
	a[0] = len;
	int x;
	i = 1;
	while (cin >> x)
	{
		a[i] = x;
		i++;
	}
	return a;
}
int main()
{
	int *len = create();
	cout << len + 1 + 1 << " "<< len + 3 + 1 << endl;
	for (int *i = len; i < len + *len; i++)
	{
		cout << *i << " ";
	}
	return 0;
}
编译成功
0 1 2 3 4 5 6 7 8 9 10 11 12
0 2
0 1 2 3 4 5 6 7 8 9 10 11 12

代码运行结束

这个歪瑞古德(very good),不过涉及了很多指针知识。
还有一种更简单的办法,就是设置结束符,你可能听不懂,但是只要听到字符串和’\0’你就明白了。就是在返回的数组内容结束的下一位设置一个结束符,在主程序里一个一个的读取直到读到结束符。

二维数组

二维数组也是可以的,只不过指向长度1,下一个是长度2或者指向长度1乘长度2。歪瑞古德的方法也是可以的,另外的方法应该可以自己想出来。

函数的参数是函数

这个有点绕,类似sort函数的参数cmp。
用到了函数指针,这样定义

函数返回类型 (*函数名)(参数列表)
这就是函数指针
应用到函数中:
void a(int (*b)(int,int))
sort 和 cmp(常用名) 的关系差不多就是这样的

看不懂上实例

#include <bits/stdc++.h>
using namespace std;
int *arraymake(int len, int (*numget)(int))
{
	int a = int[len];
	for (int i = 0; i < len; i++)
	{
		a[i] = numget(i);
	}
	return a;
}
int plus2(int i)
{
	return i + 2;
}
int random(int i)
{
	srand(time(0));
	return rand() % 100;
}
int main()
{
	int a[10] = arraymake(10, ng);
	cout << a[2] << endl;
	int b[5] = arraymake(5, random);
	cout << a[8] + b[3] << " " << a[9] * b[1] << endl;
	return 0;
}

事实上,每次不是相同的输出结果,所以我就没写输出,大家运行着看,是不是还挺好用的?
输出结果,一般是这样的:

编译成功
33 23412

代码运行结束

但是是随机的哈。

函数

这里给大家几个我编的函数,里面有的运用了这些知识,Print()函数大家不知道用不用,反正我觉得挺有用的。

Math.h
#include <bits/stdc++.h>
// 数据类型范围
#define SRT_MIN = -32768
#define SRT_MAX = +32767
#define USRT_MAX = 65535
#define INT_MIN	= -2147483648
#define INT_MAX	= +2147483647
#define UINT_MAX = 4294967295
#define LNG_MIN	= -9223372036854775808
#define LNG_MAX = +9223372036854775807
#define ULNG_MAX = 18446744073709551616
#define FAT_MIN = -8388608.0000000
#define FAT_MAX = +8388607.9999990
#define UFAT_MAX = 16777216.0000000
#define DLE_MIN = 4503599627370495.0000000000000000
#define DLE_MAX = 4503599627370496.9999999999999990
#define UDLE_MAX = 4503599627370496.0000000000000000
using namespace std;
// 求更大的一个数,用了模板,戳后面的链接了解
template <class type>
type max(type a, type b)
{
    if (a > b)
        return a;
    else
        return b;
}
// 求更小的一个数
template <class type>
type min(type a, type b)
{
    if (a < b)
        return a;
    else
        return b;
}
// 求二数之和
template <class type>
type sum(type a, type b)
{
    return a + b;
}
// 求数组元素最大值
template <class type>
type Max(type *a, int len, type smallest)
{
    type result = smallest;
    for (type *i = a; i <= a + len; i++)
    {
        result = max(result, *i);
    }
    return result;
}
// 求数组元素最小值
template <class type>
type Min(type *a, int len, type biggest)
{
    type result = biggest;
    for (type *i = a; i <= a + len; i++)
    {
        result = min(result, *i);
    }
    return result;
}
// 求数组元素和
template <class type>
type Sum(type *a, int len, type zero)
{
    type result = zero;
    for (type *i = a; i <= a + len; i++)
    {
        result = sum(result, *i);
    }
    return result;
}
Print.h
#include <bits/stdc++.h>
using namespace std;
void Print1(int *a, int l1, string s1)
{
	for (int *i = a; i <= a + (l1 - 1); i++)
	{
		cout << *i << s1;
	}
}
void Print2(int *a, int l1, int l2, string s1, string s2)
{
	for (int *i = a; i <= a + (l1 - 1) * l2; i += l2)
	{
		for (int *j = i; j <= i + (l2 - 1); j++)
		{
			cout << *j << sep;
		}
		cout << endline;
	}
}
void Print3(int *a, int l1, int l2, int l3, string s1, string s2, string s3)
{
	for (int *i = a; i <= a + (l1 - 1) * (l2 - 1) * l3; i += (l2 - 1) * l3)
	{
		for (int *j = i; j <= i + (l2 - 1) * l3; j += l3)
		{
			for (int *k = j; k <= j + (l3 - 1); k++)
			{
			    cout << *k << s1;
			}
			cout << s2;
		}
		cout << s3;
	}
}
main.cpp
#include <bits/stdc++.h>
#include <Math.h>
#include <Print.h>
using namespace std;
int main()
{
	cout << "int最大值" << INT_MAX << endl;
	cout << "int最小值" << INT_MIN << endl;
	cout << "unsigned long long最大值" << ULNG << endl;
	int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
	cout << "a数组元素";
	Print1(a, 10, " ");
	cout << endl;
	cout << "a数组最大值" << Max(a, 10) << endl;
	cout << "a数组最小值" << Min(a, 10) << endl;
	cout << "a数组总合" << Sum(a, 10) << endl;
	return 0;
}
编译成功
int最大值2147483647
int最小值-2147483648
unsigned long long最大值18446744073709551616
a数组元素1 2 3 4 5 6 7 8 9 10
a数组最大值10
a数组最小值1
a数组总合55

代码运行结束

小结

口诀:

传入数组很简单,
指针变量代数组。
传出数组用指针,
长度可以在前面。
参数函数还可以,
百变多端的函数!
附录

关于戳模板链接:在此戳戳

Update

[UPD 2022.9.11] 好久没看这个了,改了一下前言,加了一个不定长度返回数组的方法,还有就是改了一下Math.h里的BUG(居然把type写成tyoe了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值