C语言怎么使用指针传值

        前几篇我们学习了C语言怎么创建值,初始化值,创建指针,使用指针。这次我们来写一个小程序,学习如何通过函数传值。

void Increment(int a){
    a = a+1;
}

int main(){
    int a;
    a = 10;
    //调用Increment,对a进行加法操作
    Increment(a);
    printf("a = %d\n", a); //a输出10
}

        在上面的代码中,main()中明明调用了Increment函数,也进行了加法操作,为什么最后main()中a打印出来还是10.

我们分别将Increment函数和main()的a打印出来

大家看出区别了吗,是的两个a的地址并不一样,操作的不是同一个a,自然就达不到预期的结果。

为什么不一样? 我们要去理解在程序运行时在内存中到底发生了什么?

1.首先在程序启动时计算机会在内存中预留一些内存给这个程序使用;

2.在main()被调用时,main()中所有信息会被分配在计算内存中的栈(Stack)区域,栈中存储main()中的参数、局部变量、返回地址、当前执行的指令等,被称做栈帧;

3.到Increment函数时,main()会暂停执行,计算机会在栈中重新创建一个栈帧,里面是Increment函数里的参数a,它不能访问自己栈帧之外的变量,Increment函数调用完毕后,程序控制流会回到main(),并清除Increment函数使用的这个栈帧;

4.同样到printf(),main()执行被暂停, 转而将执行printf()【printf()不是用户定义的函数,它是一个库函数】

那要如何得到想要的结果呢?

void Increment(int *p){
    //'*p'解引用'a'的地址,下面这一行代码将会对'a'地址中的值加1
    *p = (*p) + 1;
}

int main(){
    int a;
    a = 10;
    //这样传给Increment函数的将是'a'的地址
    Increment(&a); 
    printf("a = %d\n", a); //a将输出11
}

所以当我们传变量的地址,不是传值,指针可以解引用,并做一些操作,这就是传引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值