前几篇我们学习了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
}
所以当我们传变量的地址,不是传值,指针可以解引用,并做一些操作,这就是传引用。