2015 0606
一直在用数组作为实参,因为在函数定义中,数组名等同于数组第一个数据的地址,所以用作实参的时候很方便(因此,想要通过函数改变数组中的数据是比较方便的)。但是今天编程的时候遇到的问题就是,一旦变量不是全局变量,它在各种函数内使用和修改受到很大局限,所以查找了一下变量作为函数定义里实参的用法。
百度里的错误例子:
#include <stdio.h>
int show1(int number);
int show2(int number1); int main(void) { int number = 10; int number1=3; show1(number); show2(number1); return 0; } int show1(int number) { printf("\n show1 *pnumber is : %d,and pnumber's address is :%p\n",number,&number); return 0; } int show2(int number1) { printf("\n show2 *pnumber is : %d,and pnumber's address is :%p\n",number1,&number1); return 0; }关于上述程序,百度里别的人回答:
(1)这是因为C语言的函数参数传递是按值传递的,不是按地址传递,参数从实参传递给形参时是拷贝一份然后传递,不影响原来参数的值。并且下次再传递时还是占用这一块临时区。所以地址是一样的。
(2)这个就是C语言的所谓“值传递”
1)虽然你传递的参数不同,num1,num2;但是C编译出来不会把num1/2本身地址传递进去,只是把值传递进去
2)把值传递进去就意味着不使用原来的&num1,&num2两个内存单元来储存这个值,所以系统要提供其它的内存单元来存储和传递这个值。
3)具体使用什么样的内存单元来来储存和传递这个值则是C语言相关也是体系相关。X86使用stack来传参数,ARM/MIPS则使用寄存器来传参数。
4)在X86的体系内,会分配一个4字节的stack地址来存储你的参数,所以打印出来的是该stack单元地址
5)你的两个函数调用都是一个入参数,也就是进入时分配一个stack,退出时释放该stack,所以打印出来的stack地址总是一样的
6)你可以尝试改成shownum1传入2个入参(num1,num2),然后里面在嵌套调用shownum2也是两个入参(num1,num2),打印出来的地址绝对是不一样的。因为show1的stack还没有释放,机械调用show2,它就不能重复利用show1的stack地址了。
接着是百度里正确的程序:
#include <stdio.h>
int
show1(
int
*number);
//其实这里形参名称最好是不同于实际数据名称的,这样容易混淆。另外,函数声明时是不需要写明形参或者实参名称的
int
show2(
int