函数参数的不同和“夸张”的引用

来源:互联网 发布:adsl拨号软件 编辑:程序博客网 时间:2024/04/30 00:57
函数的形参的可能性有,变量,指针,数组和引用。
先来看变量。
int fun(int a,int b)      例如此函数形参是两个变量,它们的存储地址和主调函数里的实参是不同的,所以
{                            改变了形参的大小,并不会改变实参的大小。但为什么分配的内存不同,还可以把返回值带回?
     int c;                这是因为在return C时,这个值返还给了EAX,通过此寄存器将值给主调函数。由此可以看出,
   c=a+b;              其实并没有影响或干预fun函数里面变量的生存期。
 return c;              有的人或许会问,那我想通过调用函数改变主调函数的值怎么办啊?
}                         
                          这就谈到了传址调用。
                          什么是传址调用那?
                         就是形参是一个指针,他接受的是一个地址。当它是数组的时候,它退化成了一个指向数组首元素的地址的指针;指针就是指向实参的地址;在这里
                       
                        要重点说说引用的作用。
                        引用的符号是&,那系统什么时候认为它是引用那?
                        当&符号在两个变量之间时,系统就把它定义为位运算符,当&符号在赋值运算符和一个变量或数组的中间时,就是取其地址,当&在一个类型名和一个变量中间   
                        时,就代表了引用。
                        引用代表什么意思那?
                        就比如一个人叫林浅雪,她的小名叫小雪,引用就相当于她的别名,我们可以通过小雪找到她,也可以通过她的大名找到她。
                       当引用作为形参时,编译器就会将其变成,指针的形式,就相当于 (类型)*const 变量   形式。由此可以看出,它的指向不可以变,但是它指向的内容却可以变。
                       
                        那引用有什么限制?
                      1: 引用没有二级,或者说三级。
                      2:引用在定义的时候必须初始化。
                    
可能有人会问,不是说引用在定义的时候必须初始化,那当引用是形参的时候不是就没有初始化了吗?
     6:  int *b=&a;
012D15F5  lea         eax,[a]
012D15F8  mov         dword ptr [b],eax
     7:  int &c=a;
012D15FB  lea         eax,[a]
012D15FE  mov         dword ptr [c],eax

如图:是反汇编里面对引用的处理,由此可以看出,编译器把引用与指针做了一样的处理。








原创粉丝点击