嵌入式学习之路(十三)——C语言学习(8)
1.前面我们已经讲了数组,接下来我们可以讲讲函数了。首先我们先来写一个函数
1 #include <stdio.h>
2
3 int sum(int , int);/*函数声明*/
4
5 int sum(int a, int b)/*求和函数*/
6 {
7 return (a+b);/*返回求和结果*/
8 }
9 int main(int argc,char *argv[])
10 {
11 int a = 0,b = 0;
12 a = 2;
13 b = 2;
14 printf("sum = %d\n",sum(a,b));/*传递实参,调用函数,打印结果*/
15 return 0;
16 }
我们来看一下,sum(int a,int b):他是一个求和函数,有两个形式参数,分别是a,和b。a和b都是局部变量,在执行完这个函数之后都会被收回,如果主函数不调用sum的话,这个函数就不会执行。a和bd的值都是通过主函数里的实参传递的,如本程序的a = 2, b =2 传入了sum函数里面的a和b,并且将计算结果a+b = 4通过函数的返回值4,传递给主函数,所以我们在主函数中可以打印出结果4.我们来看下效果
xuxb@xuxb-K42JZ:~/csdn/biaoc/day13$ ./sum
sum = 4
正如大家所见,4的确输出了。这是最基础的啦,接下来看看笔试经常会考到的。
2.题:
1 #include <stdio.h>
2
3 int sum(int arr[5])
4 {
5 printf("sizeof(arr) = %d\n",sizeof(arr));
6 int sum = 0;
7 int i = 0;
8 for(i = 0;i < 5;i++)
9 {
10 sum += arr[i];
11 }
12 return sum;
13 }
14
15 int main(int argc,char *argv[])
16 {
17 int arr[5] = {1,2,3,4,5};
18 printf("sizeof(arr) = %d\n",sizeof(arr));
19 printf("sum = %d\n",sum(arr));
20 return 0;
21 }
我们可以看看这两条一样的语句执行的结果是否一样呢?
我们直接来看下结果
xuxb@xuxb-K42JZ:~/csdn/biaoc/day13$ ./sum1
sizeof(arr) = 20
sizeof(arr) = 4
sum = 15
我们可以看到主函数里的sizeof(arr) = 15
求和函数里的sizeof(arr) = 4
我们这边可以得出结论,数组做形参传递的地址,地址的sizeof是4个字节
这里也补充一下,指针的sizeof也是4个字节哦
这是因为指针是一个变量,然而指针变量是一个变量,他是4个字节,不管他指向什么,sizeof(p) = 4
3.接下去讲讲递归函数
编写一个函数,实现n的阶乘?
1 #include <stdio.h>
2 int sum(int);
3 int sum(int num)
4 {
5 if(num == 1)
6 {
7 return 1;
8 }
9 return num * sum(num-1);
10 }
11 int main(int argc,char *argv[])
12 {
13 int num = 5;
14 printf("%d的阶乘 = %d\n",num,sum(num));
15 return 0;
16 }
17 我们来看看结果
xuxb@xuxb-K42JZ:~/csdn/biaoc/day13$ ./sum2
5的阶乘 = 120
我们可以看到结果是正确的
在sum函数里面我们可以看到里面又调用了sum函数,这样在C语言中就叫做函数的递归调用
大家写递归函数的时候可以这样思考问题
比如我们要算5的阶乘,5! = 5*4*3*2*1 我们要先算 5*4!就相当于num * sum(num-1)
然后计算到什么时候退出呢?是计算到1的时候退出,所以我们就写了一个if分支,表示退出条件
这样一个完整的递归函数就结束了
那么今天就先到这里吧!再见
1 #include <stdio.h>
2
3 int sum(int , int);/*函数声明*/
4
5 int sum(int a, int b)/*求和函数*/
6 {
7 return (a+b);/*返回求和结果*/
8 }
9 int main(int argc,char *argv[])
10 {
11 int a = 0,b = 0;
12 a = 2;
13 b = 2;
14 printf("sum = %d\n",sum(a,b));/*传递实参,调用函数,打印结果*/
15 return 0;
16 }
我们来看一下,sum(int a,int b):他是一个求和函数,有两个形式参数,分别是a,和b。a和b都是局部变量,在执行完这个函数之后都会被收回,如果主函数不调用sum的话,这个函数就不会执行。a和bd的值都是通过主函数里的实参传递的,如本程序的a = 2, b =2 传入了sum函数里面的a和b,并且将计算结果a+b = 4通过函数的返回值4,传递给主函数,所以我们在主函数中可以打印出结果4.我们来看下效果
xuxb@xuxb-K42JZ:~/csdn/biaoc/day13$ ./sum
sum = 4
正如大家所见,4的确输出了。这是最基础的啦,接下来看看笔试经常会考到的。
2.题:
1 #include <stdio.h>
2
3 int sum(int arr[5])
4 {
5 printf("sizeof(arr) = %d\n",sizeof(arr));
6 int sum = 0;
7 int i = 0;
8 for(i = 0;i < 5;i++)
9 {
10 sum += arr[i];
11 }
12 return sum;
13 }
14
15 int main(int argc,char *argv[])
16 {
17 int arr[5] = {1,2,3,4,5};
18 printf("sizeof(arr) = %d\n",sizeof(arr));
19 printf("sum = %d\n",sum(arr));
20 return 0;
21 }
我们可以看看这两条一样的语句执行的结果是否一样呢?
我们直接来看下结果
xuxb@xuxb-K42JZ:~/csdn/biaoc/day13$ ./sum1
sizeof(arr) = 20
sizeof(arr) = 4
sum = 15
我们可以看到主函数里的sizeof(arr) = 15
求和函数里的sizeof(arr) = 4
我们这边可以得出结论,数组做形参传递的地址,地址的sizeof是4个字节
这里也补充一下,指针的sizeof也是4个字节哦
这是因为指针是一个变量,然而指针变量是一个变量,他是4个字节,不管他指向什么,sizeof(p) = 4
3.接下去讲讲递归函数
编写一个函数,实现n的阶乘?
1 #include <stdio.h>
2 int sum(int);
3 int sum(int num)
4 {
5 if(num == 1)
6 {
7 return 1;
8 }
9 return num * sum(num-1);
10 }
11 int main(int argc,char *argv[])
12 {
13 int num = 5;
14 printf("%d的阶乘 = %d\n",num,sum(num));
15 return 0;
16 }
17 我们来看看结果
xuxb@xuxb-K42JZ:~/csdn/biaoc/day13$ ./sum2
5的阶乘 = 120
我们可以看到结果是正确的
在sum函数里面我们可以看到里面又调用了sum函数,这样在C语言中就叫做函数的递归调用
大家写递归函数的时候可以这样思考问题
比如我们要算5的阶乘,5! = 5*4*3*2*1 我们要先算 5*4!就相当于num * sum(num-1)
然后计算到什么时候退出呢?是计算到1的时候退出,所以我们就写了一个if分支,表示退出条件
这样一个完整的递归函数就结束了
那么今天就先到这里吧!再见