回复 9楼 浩皓好
说得再浅显一些吧。
但是先把忘掉你所知的概念。
1,函数传递,不管什么你是什么方式,参数本身就是一个变量 (管你什么方式传递,这里只说C,高级语言会复杂一些) !对不对?
2,然后你要知道这个变量是什么类型。
eg.
int func(int *pTmp);
int func(int Val);
3,其次你要明白的是 函数中的这个参数 不过是一个拷贝 (因为在函数代码入栈的时候,会单独使用寄存器保存参数,而非参数本身,因为栈帧内部的局部变量是不能互相访问的,主要看操作系统是否限制)
eg.
int a = 123;
pTmp = &a; //指针pTmp此刻指向了a变量, 指针pTmp此刻保存了a变量所在的内存地址, pTmp这个变量的内容就是a变量所在的内存地址。
int func(int *pTmp)
{
*pTmp = 321;
}
模拟参数传递伪代码:
a变量地址 : 0x1000;
pTmp变量等于 0x1000;
MOV r0, pTmp; //假如r0是寄存器,它现在存放的是0x1000
LD [r0],#321; //这句话意思就是把立即数 321 装载到0x1000地址中。这样 int a是不是已经被修改了?!!!!
我们在来看下下面这个
int a = 123;
int func(int Val)
{
Val = 321;
}
还是伪代码:
a变量地址 : 0x1000;
MOV r0, #321 //这唯一的一句话,意思就是 把321传给ro。没了。 r0跟0x1000半毛钱没关系啊,所以不会影响原来的变量a。当这个函数释放掉后,r0寄存器会有其他用途,这也是局部变量为什么会被清掉的原因。
事实上上面伪代码基本上跟汇编出来的没太大区别。