函数的调用

return语句后面可以跟表达式,只要return 后面的返回值和定义的返回值相同就行

注意:ch是一个三行三列的字符型数组

字符数组初始化的末尾有一个'\0',表示这一行的结束,因为BBB刚好等于字符数组的列数,末尾的'\0'无处存放,在打印ch[1]时的结果为BBBCC

c语言中的逻辑结果其实是一个整形,(返回的int型其实是一个逻辑结果)且非零即为真

函数在调用过程中,发现参数给错了的解决办法

1、判断一下条件,不符合的返回一个-1

2、用assert函数,使用这个函数需要加头文件

c语言的特性

1、c语言中所有的传递均为值传递

在c被调函数中,修改实参的值,要传递实参的地址

2、传递方向为从右向左       先传j,再传i

函数在传参过程中,不允许对同一个变量进行操作

例:k(++i,++i)   or k(++i,i);

指令集

将高级语言转换为机器语言是由编译器完成的(gcc)

pc中放的是当前正在执行的下一条指令的地址

栈:类似于一根一端被堵住的管子

“先进后出”:最先拿出来的是最后装进去的first in,last out(FILO)

栈的两个操作:

入栈:主函数将要回到的位置

出栈:return的本质是出栈,出到pc寄存器里

为啥要把这种一进一出的过程设计为栈的数据结构:因为c语言允许嵌套调用,先调用的后返回

  

调函数前需要保护现场,调函数后需要恢复现场

保护现场目的:恢复现场

栈的空间很特别:在c中叫栈区

栈区中存放刚刚的信息,以及定义的形参和变量

栈区的空间是有限的

Linux中的栈区大小为8M

与栈区类似的还有

堆区:要用必须申请,用完以后还需要还(手动申请和销毁)在栈区定义几个指针,指向堆区里面申请的空间,通过指针控制堆区的空间

字符串常量区:“Hello”,

静态区(全局区)

代码区:所有写的代码

函数的递归调用

“循环的第五种表达形式”

函数直接或间接调用自己本身

间接递归:

直接调用:

不是死循环,而是栈区空间消耗殆尽,导致程序崩溃

递归要找不递归的条件

每调一次,重新入栈。

函数递归是以消耗内存空间为代价来实现循环的

举例:

汉诺塔:

void move(char pole1, char pole2)
{
	printf("%c->%c\n", pole1, pole2);
}

void hanoi(int n, char pole1, char pole2, char pole3)
{
	if(1 == n)
	{
		move(pole1, pole3);
	}
	else
	{
		hanoi(n - 1, pole1, pole3, pole2);
		move(pole1, pole3);
		hanoi(n - 1, pole2, pole1, pole3);
	}
}
int main(void)
{
    hanoi(4,A,B,C);
    return 0;
}
  • 17
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值