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的地址依然不相等。