13 指针的传递的使用场景

1 指针的传递

在本例的主函数中,定义了整型变量i,其值初始化为10,然后通过子函数修改整型变量i的值。但是,执行语句printf("after change i=%d\n",i);后,打印的i的值仍为10,子函数change并未改变变量i的值。

【例】指针的传递使用场景

#include <cstdio>

void change(int j){
    j=5;
}

int main() {
    int i=10;
    printf("before change i=%d\n",i);//在这里打断点
    change(i);//在这一步按下箭头,加入change函数
    printf("after change i=%d\n",i);
    return 0;
}

j和i的地址并不相同。运行j=5后,change函数实际修改的是地址0x61fdf0上的值,从10变成了5,接着change函数执行结束,变量i的值肯定不会发生改变,因为变量i的地址是0×61fe1c而非0x61fdfO。

当main函数开始执行时,系统会为main函数开辟函数栈空间,当程序走到int i时,main函数的栈空间就会为变量i分配4字节大小的空间。调用change函数时,系统会为change函数重新分配新的函数栈空间,并为形参变量j分配4字节大小的空间。在调用change(i)时,实际上是将i的值赋值给j,我们把这种效果称为值传递(C语言的函数调用均为值传递)。因此,当我们change函数的函数栈空间内修改变量j的值后,change函数执行结束,其栈空间就会释放,j就不再存在,i的值不会改变。

【例】在子函数中修改main函数中某个变量的值

#include <cstdio>

void change(int* j){
    *j=5;//间接访问得到变量i
}

int main() {
    int i=10;
    printf("before change i=%d\n",i);
    change(&i);//传递变量i的地址
    printf("after change i=%d\n",i);
    return 0;
}

将变量i的地址传递给change函数时,实际效果是j=&i,依然是值传递,只是这时我们的j是一个指针变量,内部存储的是变量i的地址,所以通过*j就间接访问到了与变量i相同的区域,通过*j=5就实现了对变量i的值的改变。通过单步调试,依然可以看到变量j自身的地址是与变量i的地址依然不相等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值