C语言函数的形参实参

在使用C语言时,由于函数的高度独立性,即在函数结束时会释放先前使用的局部变量,直接采用赋值的方式,有时无法达到利用函数处理数值的目的,这时合理利用指针,可以帮助我们越过函数高度独立性的“大山”。

下面这段代码要求用户输入两个整数,并将两数交换顺序输出:

#include<stdio.h>

void ichange(int*one,int*another);
void ichange(int*one,int*another){
    int num;
    num = *one;  //将one所指向空间值复制一份给num空间
    *one = *another;
    *another = num;
}

int main(){
    int num1;
    int num2;

    printf("请输入两个整数:");

    scanf("%d%d",&num1,&num2);

    ichange(&num1,&num2);

    printf("%d %d",num1,num2);
    return 0;
}

我们可以利用图形来具体了解计算机处理这段代码的大致过程:

a.

图a展示了计算机调用函数时,内存堆栈空间内存放数据的大致模型。

1.函数运行过程

1.1首先调用main函数,申请了两个int型变量num1,num2,由于先int num1,所以num1先入栈

1.2接着赋值,假设用户输入为7 25,则通过scanf中的&(取地址符)直接给先前申请的num1,num2变量赋值,由此可知变量实质就是一段首地址及长度已知的内存空间!

1.3.1

    接着main函数顺序运行至调用ichange函数,在开始处理子函数前,计算机会先将主函数处理的进度保存起来,以便于稍后继续执行,而储存的进度信息会以指针变量的形式存入栈中,方便索引。

    在这之后计算机才开始申请ichange函数中定义的空间,由于编译的特点,计算机总是从右至左的读取我们书写的代码,所以我们可以看到是*another空间先被申请,接着是*one空间,最后是函数主体中的num空间需要注意的是:函数申请的局部变量的空间随着函数开始而被申请,随函数结束而被释放)

b.

图b表示了ichange函数进行运算时,堆栈空间内变量的变化情况。

由于函数实参部分传递的是num1和num2的地址,所以在子函数内部修改参数值时,通过地址传递,num1和num2空间的值也立刻得到了修改,所以最终即使ichange函数运行完毕局部变量空间释放,也达到了我们修改num1,num2值的目的。

2.关于栈指针。

    实际上,计算机通过栈指针控制了栈空间的分配。栈拥有栈底指针和栈顶指针,栈顶至栈底中的信息为有用信息。一般情况下栈底指针不变,通过修改栈顶指针值,扩大或缩小栈顶至栈底的数据量,以达到数据的增加和删除。(栈顶指针上移,写入数据;栈顶指针下移,删除数据)。所以函数申请空间过程,实质是堆栈栈顶指针上移过程,而函数运行完毕释放空间过程则是栈顶指针下移过程。

3.如有意见建议欢迎讨论!

 

转载于:https://www.cnblogs.com/zeboreding/p/8884595.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值