c语言--函数(二)
函数调用
调用前,必须先定义。
使用圆括号 ,(), 函数调用运算符。 add(); 即使函数的调用,没有参数,括号不能省略。
如果需要传递参数话
1.传递参数的 个数保持一致,
2.参数类型的需要匹配。
函数的调用过程
#include <stdio.h>
void fun3()
{
printf(“this is fun3…\n”);
return ;
}
void fun2()
{
fun3();
printf(“this is fun2…\n”);
return ;
}
void fun1()
{
fun2();
printf(“this is fun1…\n”);
return ;
}
int main()
{
fun1();
printf(“this is main…\n”);
return 0;
}
函数调用流程
函数参数的传递
值传递
1.值传递 , 实参把参数数据的内容通过赋值运算符给 形参的形式。 形参是实参的一个副本(复制品)。数据内容是相同的,实参的内存空间,和形参的内存,是独立。 没有办法通过修改形参来达到修改实参的目的。
值传递只能读取实参的值, 不能进行修改
#include <stdio.h>
void fun(int arg)
{
arg++;
printf(“fun arg:%d\n”,arg);
}
void swap(int a,int b)
{
int t = 0 ;
t = a;
a = b;
b =t;
printf(“swap a:%d b:%d\n”,a,b);
}
int main()
{
int i =10;
fun(i);
printf(“i:%d\n”,i);
int a = 20;
int b =1;
swap(a,b);
printf(“main a:%d,b:%d\n”,a,b);
return 0;
}
地址传递
地址传递 ,实参传递变量的内存地址值。 即可以读实参的 数据的值 ,也可以修改。
一维整形数组做参数 , 本质是地址传递。
void fill_array(int a[],int size)// int [] a; // 如果是整形数组的化,还需要数组的大小
{
// 如果实参是数组类型,在被调内部,会降级为指针( 8 byte ,是数组在内存中的一个编号)
// int size = sizeof(a)/sizeof(a[0]);
int i = 0 ;
for(i=0;i<size;i++)
{
// 这个不是值传递, 所以可以修改数组。
a[i] = rand()%30;
}
// printf(“sizeof is a %lu\n”,sizeof(a));
// printf(“sizeof is a[0] %lu\n”,sizeof(a[0]));
}
int main()
{
srand(time(NULL));
int array[10]={0};
int size = sizeof(array)/sizeof(array[0]);
fill_array(array,size);// int []
return 0;
}
函数版本
遍历
逆序
排序 ,冒泡,选择
一维字符数组的传参 , 本质是地址传递
// 对于字符数组(字符串)而言, 约定以\0 结尾。
// 所用可以通过判断\0 的位置,可以得出字符串的长度。
// 所以不需要传入 size
int mystrlen(char a[]) // 依然是地址传递,可以对数组对写操作
{
// sizeof(a) == 8byte
int len = 0 ;
while(1)
{
if(‘\0’!=a[len])
{
len++;
}
else
{
break;
}
}
return len;
}
int main()
{
char str[100]={0}; // char []
printf(“input string1:”);
gets(str); // hello\0
int len =mystrlen(str)
return 0;
}
函数版本
遍历
mystrcmp
mystrcpy
mystrcat
mystrlen
函数的递归
难点 ,不是重点。
定义:
- 在函数内部,自己调用自己的函数调用,被称为函数的递归。
- 属于循环的一种 表现形式。 区别,会使用栈空间。
注意, - 需要设置合理的退出条件。
- 递归的层次不要太深,会消耗大量的内存,可能导致程序崩溃。
- 应用:回溯类, 逆向思维的问题的
代码与过程实例
//5! 1*2*3*4*5intfun(intn){if(1==n||0==n){return1;}else{returnfun(n-1)*n;}}intmain(){intret=fun(3);printf(" 3 的阶乘 %d\n",ret);return0;}