函数的参数和返回值

tech2022-07-10  159

函数的参数和返回值

前言

我跟大家先打个预防针,这种特殊的典论上有正方反方的我是拿不太准,但是我在进行129次试验后发现在一些编辑器上可行,反正有可能出现编辑不过,这就不归我管了… 下面的知识有可能会用到: 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),不过涉及了很多指针知识。

二维数组

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

函数的参数是函数

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

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

看不懂上实例

#include <bits/stdc++.h> using namespace std; int *shuzumake(int len, int (*numget)(int)) { int a = int[len]; for (int i = 0; i < len; i++) { a[i] = numget(i); } return a; } int ng(int i) { return i + 2; } int random(int i) { srand(time(0)); return rand() % 100; } int main() { int a[10] = shuzumake(10, ng); cout << a[2] << endl; int b[5] = shuzumake(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> tyoe 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 代码运行结束

小结

口诀:

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

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

最新回复(0)