函数的参数和返回值
前言
下面的知识有可能会用到:
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了)