C语言_(9)_函数_2

目录

1 函数传参

 2 字符型数组及字符串的传参

3 递归函数 

1 求阶乘

 2 斐波那契

 3 汉诺塔


 

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;
}

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨CX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值