刚学习C语言的时候就对传值和传址很模糊,感觉书上说的不是很明白(因为我很笨)
程序在执行的时候,首先是将程序放入内存(DRAM),程序中的变量都有相应的内存地址,对于传值调用举个例子
如 :void change(int a){
a =0;
}
void main(){
int b = 1;
change(b);
printf("%d",b);
}
输出的结果是 1,也就是说 change 函数没有将 b 的值改成0,为什么那?书上说的是change 参数中的b 是变量b的一个拷贝,所以不会改变。说的很明白,但是你可能还不懂,你可以在change()中,a=0的后面输出一下a,你回发现输出的是0,而main()函数中输出的是1。
上述操作后可以得出一个结果,就是传到change()中的参数和我们main()函数里面print的参数不是同一个变量。查看C语言的函数章节后发现函数执行的时候,参数会放在一个运行时堆栈中,而main()中的 int b,则把b放在静态存储区,而且函数执行后,会将将参数释放掉,所以print 中的b对应的是静态存储区中的b,其值为1.
函数的参数是指针,我们说传进来的是地址,内存中的地址也是唯一的,所以对指针指向的变量的操作就是对内存中该地址处存放的变量的直接操作。会修改其值。例如
void change(int *a)
{
*a =0;
}
void main(){
int *m;
int b=10;
m=&b;
printf("%d\n",*m);
change(m);
printf("%d\n",*m);
}
输出的结果为 10
0
明天又是新的一天