Pointers as function arguments - call by reference//函数传值vs传引用
#include<stdio.h>
void Increment(int a){//increment 增加
a = a + 1;//;函数中的是形式参数 形参
}
int main(){
int a;
a = 10;
Increment(a);//传递进去的对应值 是实际参数 实参
printf("a is %d\n",a);
}
上面代码结果a= 10;无法实现a= 11;
内存中的四个段,从上往下,分别是
堆heap
栈stack(局部变量都放在这里,只能在特定的函数或者特定的代码块进行访问和修改)
分配给静态或者全局变量(全局变量:在程序的任何地方都能访问和修改)
用来储存程序的指令
下面三个都是固定的,但是堆可以在运行的时候要求分配更多的内存
先进行main函数,然后main函数停止,跳转到increment函数
有一个栈帧来储存increment函数
increment使用完的栈帧会清除(局部变量的生命周期在函数执行期间一直存在)
恢复执行main函数,下一个语句是printf函数。printf函数不是用户定义的函数,它是一个库函数
main停止执行,现在执行printf函数,这种结构叫做 调用栈或者函数调用栈
栈顶的函数正在执行,栈是有固定大小的。
所以如果一个函数无限次调用另一个函数,就像是无限递归,那么栈会溢出,程序会崩溃。
如果要修改,这是我的办法。
#include<stdio.h>
void Increment(int a){//increment 增加
a = a + 1;//;函数中的是形式参数 形参
printf("a is %d\n",a);
printf("Address of variable a in increment = %d\n",&a);
}
int main(){
int a;
a = 10;
Increment(a);//传递进去的对应值 是实际参数 实参
printf("Address of variable a in main = %d\n",&a);
}
//传值调用:
//实参的值会 被拷贝/映射 到形参
//当函数被调用时,就是把一个变量映射到另外一个变量
下面是老师的办法:使用指针作为函数参数,就是在传引用
这样的函数调用不是传值,而是传地址。我们可以解引用这个变量来做一些操作。这就是传引用。能减少空间的使用。
#include<stdio.h>
void Increment(int *p){//increment 增加
*p = (*p) + 1;//;函数中的是形式参数 形参
printf("Address of variable a in increment = %d\n",p);
}
int main(){
int a;
a = 10;
Increment(&a);//传递进去的对应值 是实际参数 实参
printf("Address of variable a in main = %d\n",&a);
printf("a is %d\n",a);
}