C语言函数超详细讲解下篇

目录
  • 前言
  • 函数的声明和定义
    • 函数声明
    • 函数定义
    • 举例
      • 简单的求和函数
      • 把加法单独改写成函数
      • 添加函数声明
      • 带头文件和函数声明
      • 静态库(.lib)的生成
      • 静态库文件的使用方法
  • 函数递归
    • 什么是递归?
    • 递归的两个必要条件
    • 练习1
      • 一般方法
      • 递归的方法
    • 练习2
      • 一般方法
      • 递归方法
    • 练习3
      • 一般方法
      • 递归方法
    • 练习4
      • 一般方法
      • 递归方法
    • 递归与迭代
      • 递归隐藏的问题
      • 如何改进
      • 选递归还是迭代
  • 总结

前言

紧接上文,继续学习函数相关内容。

函数的声明和定义

函数声明

  • 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了
  • 函数的声明一般出现在函数的使用之前。要满足先声明后使用
  • 函数的声明一般要放在头文件中的

函数定义

函数的定义是指函数的具体实现,交待函数的功能实现

举例

简单的求和函数

一般写简单的求和函数,求和功能直接写在main( )函数了。

//简单的求和函数
int main()
{
	int a = 10;
	int b = 20;
	int sum = a+b;
	printf("%d\n", sum);
	return 0;
}

把加法单独改写成函数

把加法功能单独写成一个函数,放在主函数前面。如果将函数add放在主函数后面,则会报错,因为程序自上而下进行的,主函数执行后,发现add函数未定义,找不到。

//之前的有函数的写法.函数放在前面
int add(int x, int y)
{
	return x + y;
}
int main()
{
	int a = 10;
	int b = 20;
	int sum = add(a, b);
	printf("%d\n", sum);
	return 0;
}

添加函数声明

int add(int x, int y);//函数的声明

int main()
{
	int a = 10;
	int b = 20;

	int sum = add(a, b);

	printf("%d\n", sum);

	return 0;
}

int add(int x, int y)//定义放在主函数后面,需要先声明
{
	return x + y;
}

带头文件和函数声明

实际上,当函数代码较多时,一般采用模块化编程,每个函数实现功能尽量单一,函数间要低耦合、高内聚。因此,针对上面的加单的加法函数,用带头文件的写法重写一遍。

先定义源文件 test.c 、源文件 add.c和头文件 add.h

//源文件test. c
#include "add.h"
int main()
{
	int a = 10;
	int b = 20;
	int sum = add(a, b);
	printf("%d\n", sum);
	return 0;
}
//源文件add.c
int add(int x, int y)//定义放在主函数后面,需要先声明
{
	return x + y;
}
//头文件add.h
int add(int x, int y);//函数的声明

静态库(.lib)的生成

当编程写了一个减法的函数给别人用,但是又不想把源码直接分享给别人,这时候就可以将代码编译成静态库(就是.lib文件)。

静态库的特点:将函数编译成静态库,别人可以正常使用封装好的代码,但是又看不到源码。

下面举例说明,如何生成静态库(.lib):

新建VS工程,新建源文件 sub.c和 头文件 sub.h,编写一个减法函数 sub

//源文件 sub.c
int sub(int x, int y)//函数定义需要先声明
{
	return y - x;
}
//头文件 sub.h
int sub(int x, int y);

依次点击解决方案资源管理器——项目名称——右键选属性,弹出对话框。

然后依次点击——配置属性——常规——项目默认值——配置类型——下拉菜单选择静态库(.lib)——应用——确定。

接着点击生成——生成解决方案。

最终会在工程文件夹下的——Debug文件夹——看到静态库.lib文件。

用记事本打开静态库,可以看到是乱码。

静态库文件的使用方法

接下来说明如何使用别人或者自己生成好的静态库文件:

(1)将函数对应的同名头文件.h文件 和 同名静态库.lib拷贝至自己的工程文件中。

(2)在头文件中添加上t头文件 sub0119.h

(3)在源文件中添加减法头文件引用 和静态库的引用,

#include "add.h"//加法头文件
#include "sub0119.h"//减法头文件
#pragma comment(lib,"sub0119.lib")//静态库必须加上

(4)程序运行时,会通过上面的引用将生成的静态库加载进来。在主函数直接使用 减法函数sub即可。

//带头文件的写法
int main()
{
	int a = 10;
	int b = 20;
	int sum = add(a, b);//一般的函数调用
	int subnum = sub(a, b);//使用静态库
	printf("%d\n", sum);
	printf("%d\n", subnum);
	return 0;
}

运行程序见下图:

函数递归

什么是递归?

  • 递归做为一种算法在程序设计语言中广泛应用。
  • 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法
  • 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
  • 只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量
  • 递归的主要思考方式在于:把大事化小,将问题转化为可以重复有限次的小问题解决

递归的两个必要条件

  • 存在限制条件,当满足这个限制条件的时候,递归便不再继续
  • 每次递归调用之后越来越接近这个限制条件

练习1

接受一个整型值(无符号),按照顺序打印它的每一位。

输入:1234,输出 1 2 3 4

一般方法

void print(num)//自定义打印函数
{
	int arr[10] = { 0 };//定义数组
	for (int i = 0; i < 4; i++)
	{//将数字存放在数组里
		arr[i] = num % 10;//取数字最后一位
		num = num / 10;//取整数
	}
	for (int i = 3; i >= 0; i--)
	{//倒着打印
		printf("%d ", arr[i]);
	}
}
int main()
{
	int num = 1234;
	print(num);
	return 0;
}

递归的方法

分析:打印1234可以分解成下图那样拆解,分别把不同位上的数字取出,最终把数字拆解剩最后一位时,开始打印:

  • print(1234),数字大于9表明数字还不是个位数,于是将1234拆解成123 和 4,分别通过取余和取模操作。把取余的123再次传给函数print
  • print(123),数字大于9表明数字还不是个位数,于是将123拆解成12 和 3,分别通过取余和取模操作,把取余的12再次传给函数print
  • print(12),数字大于9表明数字还不是个位数,于是将12拆解成1 和 2,分别通过取余和取模操作,把取余的1再次传给函数print
  • print(1),数字小于9表明数字是个位数,也就是分解到最后一步了,这就是递归的限制条件,于是将1取模操作,打印出来

代码如下所示:

void print(int num)
{
	if (num>9)
	{
		print(num/10);	//取余
	}
	printf("%d ",num % 10);//取模
}
int main()
{
	int num = 1234;
	print(num);

	return 0;
}

通过调试,我们分析整个递归程序的运行逻辑见下图,红色圆圈的1 2 3 4表示程序的执行顺序:

  • 第一次调用函数print,此时 num=1234, n>9, 满足if条件, 执行print(123), 调用函数print自身
  • 第二次调用函数print,此时 num=123, n>9, 满足if条件, 执行print(12), 调用函数print自身
  • 第三次调用函数print,此时 num=12, n>9, 满足if条件, 执行print(1), 调用函数print自身
  • 第四次调用函数print,此时 num=1, n<9, 不满足if条件, 执行printf(“%d”, num%10), 此时num=1, 打印1

此时函数已经拆解到最后一层了,函数执行结束返回到上一次调用的地方,绿色圆圈的1 2 3 4表示程序的返回顺序:

  • 在绿色圆圈1处,函数printf打印1后,将会返回到上一次调用print的地方,即绿色圆圈2
  • 在绿色圆圈2处,if语句已经执行完毕,按顺序执行printf(“%d”, num%10),此时num=12, 打印2。接着将会返回到上一次调用print的地方,即绿色圆圈3处
  • 在绿色圆圈3处,if语句已经执行完毕,按顺序执行printf(“%d”, num%10),此时num=123, 打印3。接着将会返回到上一次调用print的地方,即绿色圆圈4处
  • 在绿色圆圈4处,if语句已经执行完毕,按顺序执行printf(“%d”, num%10),此时num=1234, 打印4。接着将会返回到上一次调用print的地方,即主函数main中。

在函数运行过程中,每调用一次函数,在内存栈中就会开辟空间存放num的值,如下面蓝色方框显示,第一次调用函数存放的1234 在最底层, 以此类推,1是最后调用函数存放的,就在最上面。

在函数返回时,看绿色圆圈 1 2 3 4, num的值就从上向下取值,

  • 在绿色圆圈1处,num数值为1。打印1后,函数运行结束,存放1的空间就销毁了
  • 此时返回到绿色圆圈2里,num数值为12,打印2后,函数运行结束,存放12的空间也销毁了
  • 此时返回到绿色圆圈3里,num数值为123,打印3后,函数运行结束,存放123的空间也销毁了
  • 此时返回到绿色圆圈2里,num数值为1234,打印4后,函数运行结束,存放1234的空间也销毁了

运行结果见下图:

练习2

编写函数不允许创建临时变量,求取字符串的长度

一般方法

//编写函数不允许创建临时变量,求取字符串的长度
void getlen(char* arr)
{
	int count = 0;//计数
	while (*arr!='\0')
	{
		count++;//计数加1
		arr++;//地址移动到下一个字符
	}
	printf("%d", count);

}
int main()
{
	char arr[] = "abcd";
	getlen(arr);//数组名就是首元素地址
	return 0;
}

递归方法

分析:自定义函数getlen,计算字符串 abcd,字符串以 '\0’结尾,这是隐藏的,实际字符串为"abcd\0"自定义函数可以分解成下图那样拆解,每次取出一个字符,最终把字符都取完,返回值:

  • getlen(abcd),判断字符是不是’\0’, 不是,于是将getlen(abcd) 拆解成 1+ getlen(bcd)
  • getlen(bcd), 判断字符是不是’\0’, 不是,于是将getlen(bcd) 拆解成 1+ getlen(cd)
  • getlen(cd), 判断字符是不是’\0’, 不是,于是将getlen(cd) 拆解成 1+ getlen(d)
  • getlen(d), 判断字符是不是’\0’, 不是,于是将getlen(d) 拆解成 1+ getlen(’\0’),已经到字符串结尾了
  • getlen(’\0’), 判断字符是不是’\0’, 是,于是返回值0,代表字符串结束了,这就是递归的限制条件

下面是实现代码:

//递归方法
int getlen(char* arr)
{
	if (*arr != 0)
	{
		arr++;
		return 1 + getlen(arr);
	}
	return 0;//等于0,字符串结束了,返回0
}
int main()
{
	char arr[] = "abcd";
	int sz = getlen(arr);
	printf("%d", sz);
	return 0;
}

程序运行结果见下图,红色路线是递归按顺序调用函数,绿色的路线是递归达到限制条件后,返回值

练习3

求n的阶乘。(不考虑溢出)

一般方法

//求n的阶乘
void fact(int n)
{
	int num = 1;
	for (int i = 1; i <= n; i++)
	{
		num = num * i;
	}
	printf("%d", num);
}
int main()
{
	fact(3);//阶乘
	return 0;
}

递归方法

分析:自定义函数fact,求n的阶乘。自定义函数可以分解成下图那样拆解:

  • fact(n)=n!=n*(n-1)…1=nfact(n-1),
  • fact(n-1)=(n-1)!=(n-1)…*1=(n-1)*fact(n-2),
  • 依次类推, fact(2)=2!=2*fact(1),
  • 判断n已经推到1了,返回fact(1) =1,这就是递归的限制条件。

//递归方法
int fact(int n)
{
	if (n >= 1)
	{
		return n*fact(n - 1);
		n--;
	}
	else
	{
		return 1;
	}

}
int main()
{
	int num=fact(3);//阶乘
	printf("%d", num);
	return 0;
}

运行结果见下图:

练习4

求第n个斐波那契数。(不考虑溢出)

一般方法

//一般方法
void fib(int n)
{
	int num1 = 1;
	int num2 = 1;
	int num3 = 0;
	for (int i = 1; i <=(n-2); i++)
	{
		num3 = num1 + num2;
		num1 = num2;
		num2 = num3;
	}
	printf("%d", num3);//输出5
}
int main()
{
	fib(5);//第五个斐波那契数列是5
	return 0;
}

递归方法

分析:自定义函数fib,求第n个斐波那契数列。自定义函数可以分解成下图那样拆解:

  • fib(1)=1,fib(2)=1
  • fib(3)=fib(2)+fib(1),fib(4)=fib(3)+fib(2),
  • 依次类推, fib(n)=fib(n-1)+fib(n-2),
  • 求fib(6),就往前递推,fib(6)=fib(5)+fib(4)
  • 一直推到 fib(3)=fib(2)+fib(1), fib(1),fib(2)为已知值,数列推到此结束了,直接给返回值就行, 这就是递归的限制条件。

//递归方法方法
int fib(int n)
{
	if (n <= 2)
	{
		return 1;
	}
	return fib(n - 1) + fib(n - 2);
}
int main()
{
	int num=fib(5);
	printf("%d", num);
	return 0;
}

递归与迭代

递归隐藏的问题

在前面7.2.2.4 小节练习4中,发现有一个问题,举例fib(6)说明,下面是计算fib(6)时用的递归方法,分析会发现fib(3)居然重复计算了3次,如果计算fib(40)时,这样的重复计算会更多,大量的重复计算势必会降低计算速度。

通过程序来验证一样,计算fib(6)时,fib(3)总共计算了几次:

int count = 0;//全局变量
int fib(int n)
{
	if (n == 3)
		count++;//计算fib(3)计算了多少次
	if (n <= 2)
		return 1;
	return fib(n - 1) + fib(n - 2);
}
int main()
{
	int num=fib(6);
	printf("%d\n", num);
	printf("%d\n", count);
	return 0;
}

结果如下所示:fib(6) = 8,fib(3)总共计算了3次:**

当计算fib(40)时,fib(3)总共计算了几次?

结果见下图,fib(40) = 102334155,fib(3)总共计算了39088169次,惊呆了居然3千多万次。而且很耗时间,计算效率低。

而用一般的方法计算fib(40)时,fib(3)只计算了一次。

如何改进

  • 在调试 factorial 函数的时候,如果你的参数比较大,那就会报错: stack overflow(栈溢出)这样的信息。例如计算fib(50)时,结果为负数,就是溢出了。

  • 系统分配给程序的栈空间是有限的,但是如果出现了死循环,或者(死递归),这样有可能导致一

直开辟栈空间,最终产生栈空间耗尽的情况,这样的现象我们称为栈溢出。

那如何解决上述的问题:

  • 将递归改写成非递归。例如计算fib(40)时,就采用一般方法计算。
  • 使用static对象替代 nonstatic 局部对象。 在递归函数设计中,可以使用 static 对象替代 nonstatic 局部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放 nonstatic 对象的开销,而且 static 对象还可以保存递归调用的中间状态,并且可为各个调用层所访问。

选递归还是迭代

  • 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。
  • 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。
  • 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销。
  • 当发现递归的算法很耗时间,都没结果出来,那可能要考虑迭代实现了。

总结

函数的学习暂时告一段落,涉及到的递归函数的实现不太好理解,这块要加大练习,才能逐渐掌握,重要的就是抽丝剥茧,找到限制条件,然后返回确定的值。

下一篇博文开始数组的学习了。

到此这篇关于C语言函数超详细讲解下篇的文章就介绍到这了,更多相关C语言 函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言中函数的声明、定义及使用的入门教程

    对函数的"定义"和"声明"不是一回事.函数的定义是指对函数功能的确立,包括指定函数名,函数值类型.形参及其类型以及函数体等,它是一个完整的.独立的函数单位.而函数的声明的作用则是把函数的名字,函数类型以及形参的类型.个数和顺序通知编译系统,以便在调用该函数时进行对照检查(例如,函数名是否正确,实参与形参的类型和个数是否一致),它不包括函数体.--谭浩强 ,<C程序设计>(第四版),清华大学出版社,2010年6月,p182 这段论述包含了许多概念性错误,这

  • C语言自定义函数的实现

    函数是一段可以重复使用的代码,用来独立地完成某个功能,它可以接收用户传递的数据,也可以不接收.接收用户数据的函数在定义时要指明参数,不接收用户数据的不需要指明,根据这一点可以将函数分为有参函数和无参函数. 将代码段封装成函数的过程叫做函数定义. C语言无参函数的定义 如果函数不接收用户传递的数据,那么定义时可以不带参数.如下所示: dataType functionName(){ //body } dataType 是返回值类型,它可以是C语言中的任意数据类型,例如 int.float.char

  • C语言函数基础教程分类自定义参数及调用示例详解

    目录 1.  函数是什么? 2.  C语言中函数的分类 2.1 库函数 2.1.1 为什么要有库函数 2.1.2 什么是库函数 2.1.3 主函数只能是main()吗 2.1.4常见的库函数 2.2 自定义函数 2.2.1自定义函数是什么 2.2.2为什么要有自定义函数 2.2.3函数的组成 2.2.4 举例展示 3. 函数的参数 3.1 实际参数(实参) 3.2  形式参数(形参) 4. 函数的调用 4.1 传值调用 4.2  传址调用 4.3 练习 4.3.1. 写一个函数判断一年是不是闰年

  • C语言菜鸟基础教程之自定义函数

    先动手编写程序: #include <stdio.h> int add(int x, int y) { int z = x + y; return z; } int main() { int a = 1; int b = 2; int c = add(a, b); printf("c = %d\n", c); return 0; } 运行结果: c = 3 程序分析: (1) 函数定义的形式为: 类型 函数名称(类型 形式参数,--) { 函数体 } (2) 对应于咱们的程

  • 深入解析C语言中函数指针的定义与使用

    1.函数指针的定义     函数是由执行语句组成的指令序列或者代码,这些代码的有序集合根据其大小被分配到一定的内存空间中,这一片内存空间的起始地址就成为函数的地址,不同的函数有不同的函数地址,编译器通过函数名来索引函数的入口地址,为了方便操作类型属性相同的函数,c/c++引入了函数指针,函数指针就是指向代码入口地址的指针,是指向函数的指针变量. 因而"函数指针"本身首先应该是指针变量,只不过该指针变量指向函数.这正如用指针变量可指向整形变量.字符型.数组一样,这里是指向函数.C在编译时

  • C语言函数超详细讲解下篇

    目录 前言 函数的声明和定义 函数声明 函数定义 举例 简单的求和函数 把加法单独改写成函数 添加函数声明 带头文件和函数声明 静态库(.lib)的生成 静态库文件的使用方法 函数递归 什么是递归? 递归的两个必要条件 练习1 一般方法 递归的方法 练习2 一般方法 递归方法 练习3 一般方法 递归方法 练习4 一般方法 递归方法 递归与迭代 递归隐藏的问题 如何改进 选递归还是迭代 总结 前言 紧接上文,继续学习函数相关内容. 函数的声明和定义 函数声明 告诉编译器有一个函数叫什么,参数是什么

  • C语言操作符超详细讲解下篇

    目录 前言 赋值操作符 单目操作符 单目操作符介绍 sizeof 和 数组 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用与函数调用和结构成员 [ ] 下标引用操作符 ( ) 函数调用操作符 访问一个结构的成员 表达式求值 隐式类型转换-整形提升 算术转换 操作符的属性 总结 前言 本文接着学习操作符的内容. 赋值操作符 赋值操作符就是能够重新赋值 int weight = 120;//体重 weight = 89;//不满意就赋值 double salary = 10000.0; s

  • C语言数组超详细讲解下篇扫雷

    目录 前言 1.扫雷是什么? 2.程序框架 2.1 主函数 2.2 函数menu 2.3 函数game 2.3.1 函数init_board 2.3.2 函数show_board 2.3.3 函数set_mine 2.3.4 函数find_mine 2.3.5 函数get_mine_count 3.头文件.h 4.游戏试玩 总结 前言 本文接着复习前面所学知识,以扫雷游戏为例. 1.扫雷是什么? 百度百科:<扫雷>是一款大众类的益智小游戏,于1992年发行.游戏目标是在最短的时间内根据点击格子

  • C语言指针超详细讲解下篇

    目录 前言 指针运算 指针±整数 4.1 指针±整数 4.2 指针-指针 4.3 指针的关系运算 5.指针和数组 6.二级指针 7.指针数组 7.1 举例 1 7.2 举例 2 总结 前言 本文接着上一篇内容,继续学习指针相关知识点. 指针运算 指针±整数 指针-指针 指针的关系运算 4.1 指针±整数 #define VALUE 5 int main() { float values[VALUE]; float *vp; //指针+-指针,关系运算 for (vp = &values[0];

  • C语言函数超详细讲解上篇

    目录 前言 1.函数是什么? 2.C语言中函数的分类 2.1 库函数 2.1.1 如何学会使用库函数 2.1.2 自定义函数 3.函数的参数 3.1 实际参数(实参) 3.2 形式参数(形参) 4.函数的调用 4.1 传值调用 4.2 传址调用 4.3 练习 4.3.1 判断一个数是不是素数 4.3.2 判断一年是不是闰年 4.3.3 二分查找 4.3.4 数值自增增加1 5.函数的嵌套调用和链式访问 5.1 嵌套调用 5.2 链式访问 总结 前言 本文主要学习函数的相关内容. 1.函数是什么?

  • C语言数据的存储超详细讲解下篇浮点型在内存中的存取

    目录 前言 浮点型在内存中的存储 浮点数存储的例子 浮点数存储规则 IEEE 754规定 IEEE 754对有效数字M的特别规定 IEEE 754对指数E的特别规定 存入内存是E的规定 从内存取出时E的规定 举例 1 举例 2 举例 3 判断两个浮点数是否相等? 总结 前言 本文接着学习数据的存储相关的内容,主要学习浮点型数在内存中的存储与取出. 浮点型在内存中的存储 常见的浮点数:3.14159.1E10 浮点数家族包括: float.double.long double 类型 浮点数表示的范

  • C语言数据结构超详细讲解单向链表

    目录 1.链表概况 1.1 链表的概念及结构 1.2 链表的分类 2. 单向链表的实现 2.1 SList.h(头文件的汇总,函数的声明) 2.2 SList.c(函数的具体实现逻辑) 2.2.1 打印链表 2.2.2 搞出一个新节点(为其他函数服务) 2.2.3 链表尾插 2.2.4 链表头插 2.2.5 链表尾删 2.2.6 链表头删 2.2.7 查找节点 2.2.8 在pos位置之前插入 2.2.9 在pos位置之后插入 2.2.10 删除pos位置 2.2.11 删除pos之后位置 2.

  • C语言操作符超详细讲解上篇

    目录 前言 1.操作符的分类 2.算术操作符 3.移位操作符 3.1 左移操作符 3.1.1 正数左移1位 3.1.2 负数左移1位 3.2 右移操作符 3.2.1 正数右移1位 3.2.2 负数右移1位 3.3 移位操作符说明 4.位操作符 4.1 练习 1 4.2 练习 2 总结 前言 操作符主要内容包括:各种操作符的介绍,用表达式求值. 1.操作符的分类 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用.函数调用和结构成员

  • C语言数组超详细讲解中篇三子棋

    目录 前言 1.三子棋是什么? 1.1 百度百科 1.2 游戏编程准备工作 2. 程序实现 2.1 搭建程序框架 2.2 模块化编程 2.2.1 源文件test.c 2.2.2 源文件play.c 2.2.3 头文件play.h 2.3 程序实现—拓展play函数 2.3.1 棋盘初始化与打印函数 2.3.2 玩家下棋函数 PlayMover 2.3.3 电脑下棋函数 ComputerMove 2.2.4 判断赢家函数 WhoIsWin 总结 前言 本文主要是对前面所学内容进行复习和练习,学习内

  • C语言数组超详细讲解上

    目录 前言 1.一维数组的创建和初始化 1.1 一维数组的创建 1.2 一维数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 2.二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存储 3.数组越界 4.数组作为函数参数 4.1 冒泡排序函数的错误设计 4.2 数组名是什么? 4.3 对数组名的用法进行总结 4.4 冒泡排序函数的正确设计 总结 前言 本文主要介绍数组相关的内容,主要内容包括: 一维数组

随机推荐