目录
1 函数传参
数组传递数据(实参int a [5])
int fun(int array[5]);
这种数组的传参方法迷惑性非常大,用此类方法传参的时候不多,这种传参方法仅仅用于,当限制传参的数组个数的时候才会用。当调用这种函数,用实参的数组名传给形参,看似形参定义了个5个整型变量的数组,实际他是一个指针,对,没有错,array的大小按理应该是4*5=20个字节。但是验证过后会发现是8个字节。因此迷惑性非常高。
int fun(int array[ ],int len);
这种数组传参的方式相对而言,用的比上面的传参方式多,调用的时候用fun(a,5),这种传法,就可以传递len个元素的数组,并且对函数内部操作数组非常便利,只需调用传递进数组的首地址和数组的元素个数即可。但是这个array还是一个指针,8个字节的大小。
int fun(int *parray,int len);
这种传参方式和第二种一模一样,他本质看上去就是一个指针,调用函数的确就传进去了自己的首地址和元素个数,这个形参的指针也指向了实参数组的首地址。没有迷惑性,我自己相对用的比较多。
如下代码我做了一个数组传参的冒泡排序,顺便体现了指针的一些操作
#include <stdio.h>
/*接收元素*/
void GetArray(int *pa, int len)
{
int i = 0;
for (i = 0; i < len; i++)
{
scanf("%d",pa++);
}
}
/*排序元素*/
void SortArray(int *pa, int len)
{
int i = 0;
int j = 0;
for(i = 0; i < len - 1; i++)
for(j = 0; j < len - 1 - i; j++)
{
if(*(pa + j) > *(pa + j + 1))
{
*(pa + j) = *(pa + j) ^ *(pa + j + 1);
*(pa + j + 1) = *(pa + j) ^ *(pa + j + 1);
*(pa + j) = *(pa + j) ^ *(pa + j + 1);
}
}
}
/*输出元素*/
void PutArray(int *pa, int len)
{
int i = 0;
printf("排序后\n");
for(i = 0; i < len; i++)
{
printf("%d\t",*pa++);
}
printf("\n");
}
int main(int argc, const char *argv[])
{
int a[10] = {0};
GetArray(a,10);
SortArray(a,10);
PutArray(a,10);
return 0;
}
运行结果
2 字符型数组及字符串的传参
字符串的传参当然,可以和上方数组一样,进行传参。但是字符串有一个特殊之处,在每一个字符串的最后都会带一个\0,所以我们可以用while循环对其遍历操作,判定最后一个是不是\0就行,所以传参的时候就可以不用传有多少个数组元素,只需判定即可。
这个简单例子表示
#include <stdio.h>
void PutStr(char *pstr)
{
while('\0' != *pstr)
{
printf("%c\t",*pstr++);
}
printf("\n");
}
int main(int argc, const char *argv[])
{
char str[32] = {"hello world"};
PutStr(str);
return 0;
}
运行结果
3 递归函数
递归函数,在函数定义的时候,调用函数体本身的函数。但是要注意的是,递归函数一定要有结束的条件。如果没有结束条件,可能将会无限的递归下去。而且要避免深层次的递归。
int fun(void)
{
fun();
return 0;
}
下面用三个递归的例子来解释
1 求阶乘
#include <stdio.h>
int fun(int tmp)
{
if(1 == tmp)
{
return 1;
}
else
{
return tmp * fun(tmp - 1);
}
}
int main(int argc, const char *argv[])
{
int n = 0;
printf("请输入要求阶乘的数n\n");
scanf("%d",&n);
printf("n! = %d\n",fun(n));
return 0;
}
2 斐波那契
封装一个函数,获得斐波那契数列第n项的值
1 1 2 3 5 8 13 21 34 ........
读题知道从第三项开始,每一项就是前面两项的和
#include <stdio.h>
int fun(int tmp)
{
int i = 0;
if(1 == tmp || 2 == tmp)
{
return 1;
}
else
{
return fun(tmp - 1) + fun(tmp - 2);
}
}
int main(int argc, const char *argv[])
{
int n = 0;
scanf("%d",&n);
printf("fb = %d\n",fun(n));
return 0;
}
3 汉诺塔
#include <stdio.h>
int i = 1;
void HanNuoTa(int n,char scr,char tmp,char dst)
{
if(1 == n)
{
printf("第%d步",i++);
printf("%c - > %c\n",scr,dst);
}
else
{
HanNuoTa(n - 1,scr,dst,tmp);
printf("第%d步",i++);
printf("%c - > %c\n",scr,dst);
HanNuoTa(n - 1,tmp,scr,dst);
}
}
int main(int argc, const char *argv[])
{
char scr = 'A';
char tmp = 'B';
char dst = 'C';
int n = 0;
printf("请输入汉诺塔的层数\n");
scanf("%d",&n);
HanNuoTa(n,scr,tmp,dst);
return 0;
}