------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、函数
1.函数是用于完成特定任务的程序代码段。
2.函数的好处:a.函数的使用可以省去重复代码的编写。b.函数使程序更加模块化,从而有利于程序的阅读、修改和完善。
3.定义格式:
返回值类型 函数名(形式参数列表)
{
函数体
}
// 函数声明
int sum (int,int);
int main(){
// 函数调用
int sum = sum (5,5);
return 0;
}
// 函数定义
int sum (int a,int b){
return a + b;
4.递归:C允许一个函数调用其本身,这种调用过程称作递归。递归一般可以代替循环语句使用,但其执行效率没有循环语句高。
例如:
#include<stdio.h>
int up_and_down(int);
int main()
{
up_and_down(1);
return 0;
}
int up_and_down(int n)
{
printf("数字为%d,内存中的位置%p\n",n,&n);
if (n<4) {
up_and_down(n+1);
printf("数字为%d,内存中的位置%p\n",n,&n);
}
return 0;
}
运行结果为:
注意:每一级的递归都使用自己的私有变量n。
递归的基本原理:
a.每一级的函数调用都有自己的变量。
b.每一次的函数调用都会有一个返回。
c.递归函数中,位于递归调用前的语句和各级被调函数具有相同的执行顺序。
d.递归函数中,位于递归调用后的语句的执行顺序和各个被调函数的顺序相反。
e.虽然每一级递归都有自己的变量,但是函数代码并不会得到复制。
f.递归函数中必须包含可以终止递归调用的语句。
5.函数的其他特性:
a.参数名不能跟函数内的局部变量同名
b.void可以省略return
c.可以多次使用return
d.return后面不能有其他语句
e. 函数的弱语法
(1)如果没有写返回值类型,默认是int
(2)如果写了返回值,可以不返回
(3)调用一个没有定义过的函数
f..h文件写函数的声明
g..c文件写函数的定义
h.要想别人的函数,请包含对应的.h文件
二、数组
1.数组(array)由一系列类型相同的元素组成。
2.特点:
a.元素是有序的
b.所有元素都是相同类型的
c.数组名是数组的首地址,也是第一个元素的首地址
#include <stdio.h>
int main(){
int arr[3] = {1,2,3};
printf("数组首地址 : %p ,第一个元素首地址 :%p\n" ,arr ,&(arr[0]));
// 打印结果 : 数组首地址 : 0028FF30 ,第一个元素首地址 :0028FF30
return 0;
}
3.数组的初始化:
/ 初始化方式
int a[3] = {1, 9, 3};
int a[3] = {3,9};
int a[] = {11, 5, 7};
int a[4] = {[1]=11,[0] = 7};
// 访问数组元素
printf("第 %d 个元素 : %d\n" ,0 ,a[0]);
4.数组的使用注意:
// 合法初始化方式
int arr[3] = {1,2,3};
int a = 3;
// 编译会报错
// 因为有可能变量 a 没被初始化
// int arr1[a] = {1,2,3};
// 编译通过但可能有风险
// 如果 a 没被初始化他的值是一个不确定的值,可能为负数
int arr1[a];
// 数组的下标从 0 开始,最后一个元素的下标是 元素个数减一
a[0] = 0;
// 最后一个元素
a[2] = 0;
// 数组越界,非常危险,因为它可能访问了操作系统的一块重要的内存空间,非常危险
a[3] = 0;
5.二维数组:
二维数组是一个特殊的一维数组:它的元素是一维数组。例如int a[2][3]可以看作由一维数组a[2]和一维数组a[3]组成,这两个一维数组都包含了3个int类型的元素。二维数组在概念上是二维的,即是说其下表在两个方向上变化, 下标变量在数组中的位置也处于一个平面之中, 而不是象一维数组只是一个向量。
6.二维数组的使用:
<span style="font-size:12px;">int a[3][4] = {1,2,3,4,5,6};
int a[3][4] = {{},{},{}};
// 数组元素简单访问
int a[][5] = {3,21,31,2,32,1};
// 注意错误:
int a[3][4];
a[3] = {};</span><span style="font-size:18px;">
</span>
三、总结与心得
1.函数可以作为大型程序的组成模。每个模块应该实现某个明确的功能。使用参数可以向函数传递数值,并且通过关键字return让函数返回一个数值。如果函数返回值的类型不是int,那么必须在函数定义中以及调用函数的声明部分指定函数的返回值类型。
2.C函数可以调用其自身,这种调用的方式被称为递归。有些问题需要借用递归解决,但是递归可能会在内存使用和时间花费方面效率低下。
3.C把数组名解释为该数组首元素的地址。
4.数组不能作为函数参数进行传递,但是可以传递数组的地址。