函数的调用就是在内存中开辟一块空间来保存被调函数的临时数据,当被调用函数结束后,该内存就会被释放。 指针其实也是一个变量,只是保存的是一个地址,而变量保存的值。
传值
实参拷贝一份数值给形参,在传递完之后,形参与实参就没有联系了。因此形参在被调用函数中的修改将不会被影响到实参。
传指针
指针的传递与值的传递相差不大,使用拷贝的方式(将数据的地址(指针)拷贝一份给到形参)然后系统会开辟一个空间来保存这个地址,因此可以在被调函数中修改该地址(指针),当指针被修改后指向的就不是实参了。 之所以传指针能修改实参中的值,是因为在传进来的地址(指针)还没有被修改的时候,指向的是实参的值。 如上图所示,在被调函数中开辟一个空间保存是形参(指针)的拷贝值,因此如果没有修改被调函数保存的地址(指针)01003H的时候,还是可以修改指向的实参(a)的值,但是在被调函数中修改69877H中的地址值后,就不再指向a了,如果再修改指向的值的话就不会修改实参(a)的值。 因此为了保证形参中的指针不被改变,应该在形参列表中添加const比如如下的情况:
void func(int *const a)
传引用
引用:
- 申明的时候就被定义,而且只能呗定义一次,之后就不能进行修改;
- 引用就是起别名
在博客中介绍到 引用的传递可以理解为没有为这个形参开辟空间,因为在函数调用的时候形参的地址空间和实参的地址空间一样,因此在修改形参的时候就是在修改实参的值。 或者可以理解为在使用引用传递的时候,实参就相当于原函数和被调函数的共享数据(或者静态数据)。 更详细的解释见 以上为个人的见解,如有错误欢迎指正!!!!
|