学习记录第十天

函数的参数

按值传递:函数接收的是参数的副本。在函数中对参数的修改不会影响到调用者。

int fn(int n)
{
    n = n + 1;
    return n;
}

int main(void)
{
    int a = 10;
    fn(a);
    printf("%d\n",a); //结果为10
    return 0;
}

函数的参数传递顺序是从右向左的。这意味着在函数调用时,最后一个参数会最先被计算和压入栈中,其次是倒数第二个参数,依此类推,直到第一个参数。

函数的调用机制
当一个函数被调用时,会发生以下过程:
  1.保存调用者的上下文:包括寄存器值和程序计数器,以备函数返回后继续执行。
  2.分配栈空间:为函数的局部变量和参数分配内存。
  3.执行函数体:执行函数内部的代码。
  4.恢复调用者的上下文:函数执行完毕后,恢复调用者的状态,包括释放栈空间。
  5.返回控制权:将控制权交还给调用者,同时传递返回值(如果有)。

函数嵌套调用
函数嵌套调用是指在一个函数的执行过程中调用另一个函数。这种调用方式可以帮助程序员将复杂的问题分解成更小、更易管理的部分,从而提高代码的可读性和可维护性。
嵌套调用的实现
当一个函数调用另一个函数时,系统会将被调用函数的参数、局部变量等信息压入栈中,并在调用结束后自动恢复这些信息。这种机制允许函数调用的层次结构,即一个函数可以在另一个函数的执行过程中被调用,形成嵌套调用的层级结构。

int add(int a, int b) 
{
    return a + b;
}

// 定义一个用于计算两个数之积的函数
int multiply(int a, int b) 
{
    return a * b;
}

// 定义一个新的函数,它嵌套调用add和multiply函数
int calculate(int a, int b) 
{
    int sum = add(a, b);
    int product = multiply(sum, sum);
    return product;
}

int main(void) 
{
    int x = 5, y = 10;
    int result = calculate(x, y);
    printf("%d\n", result);
    return 0;
}

函数递归调用
递归调用是函数调用自身的一种特殊形式。在C语言中,递归是一种强大的工具,可以用来解决那些可以分解为相似子问题的任务,如计算阶乘、遍历树状结构、求解汉诺塔问题等。
递归的基本概念
  1.基本情况:这是递归调用的终止条件。递归函数必须包含一个或多个基本情况,否则将导致无限递归,最终可能因为栈溢出而崩溃。
  2.递归情况:这是函数调用自身的部分

int factorial(int n) 
{
    if (0 == n) 
    { 
        return 1;
    } 
    else 
    { 
        return factorial(n - 1) * n;
    }
}

int main(void) 
{
    int n = 5;
    printf("%d\n",factorial(n));
    return 0;
}

递归调用的注意事项
  1.避免无限递归:确保递归函数中包含至少一个基本情况,以防止无限递归。
  2.效率问题:递归可能会导致大量的函数调用和栈空间的使用,因此在处理大规模数据时,递归可能不如迭代效率高。递归深度过大还可能导致栈溢出。

栈区、堆区,字符串常量区,静态区,代码区:

栈区(Stack)
栈区是用于存放局部变量、函数参数、返回地址和函数的激活记录的内存区域。它遵循后进先出(LIFO)的原则,即最后进入的数据会最先被移除。栈区的大小通常由操作系统预先设定,并且在程序运行期间由编译器自动管理。
堆区(Heap)
堆区是用于动态内存分配的区域,程序可以在运行时请求和释放堆内存。堆区的管理通常由程序员通过显式调用内存分配和释放函数(如malloc和free)来控制。堆区的内存分配方向通常是从低地址向高地址增长。
字符串常量区
字符串常量区存放程序中的字符串字面量,这些常量在程序编译时就已经确定,并且在程序的整个执行期间都是不可变的。字符串常量通常存储在只读的内存区域中。
静态区(Static Area)
静态区通常是指存放静态变量和全局变量的内存区域。静态变量包括静态局部变量和静态全局变量,它们的生命周期贯穿整个程序执行期。静态变量在程序结束后不会立即释放,而是由操作系统管理。
代码区(Code Segment)
代码区存放编译后的机器代码,即程序的执行指令。这个区域通常是只读的,以防止程序在运行时意外修改自身的代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值