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