直接形参是将实参的值拷贝给形参,对形参的访问与实参没任何关系。void swap_cpy (int a, int b)
{
...
}
指针形参方式是:将实参的地址拷贝给指针变量,而指针的地址才是直接访问指针变量的地址。void swap_ptr (int *a, int *b)
{
...
}
引用就是将实参的地址直接给形参,形参地址就是实参地址。void swap_ref (int &a, int &b)
{
...
}
结果:#include <iostream>
using namespace std;
void swap_cpy (int a, int b)
{
int c;
c = a;
a = b;
b = c;
cout << "--- swap_cpy (int a, int b) begins ---" << endl;
cout << "a = " << a << ", " << "b = " << b << endl;
cout << "&a = " << &a << ", " << "&b = " << &b << endl;
cout << "--- swap_cpy (int a, int b) ends --- " << endl;
}
void swap_ptr (int *a, int *b)
{
int c;
c = *a;
*a = *b;
*b = c;
cout << "--- swap_cpy (int *a, int *b) begins ---" << endl;
cout << "*a = " << *a << ", " << "*b = " << *b << endl;
cout << "a = " << a << ", " << "b = " << b << endl;
cout << "&a = " << &a << ", " << "&b = " << &b << endl;
cout << "--- swap_cpy (int *a, int *b) ends ---" << endl;
}
void swap_ref (int &a, int &b)
{
int c;
c = a;
a = b;
b = c;
cout << "--- swap_cpy (int &a, int &b) begins ---" << endl;
cout << "a = " << a << ", " << "b = " << b << endl;
cout << "&a = " << &a << ", " << "&b = " << &b << endl;
cout << "--- swap_cpy (int &a, int &b) ends ---" << endl;
}
void try_ref ()
{
int x = 1;
int y = 8;
cout << "x = " << x << ", " << "y = " << y << endl;
cout << "&x = " << &x << ", " << "&y = " << &y << endl;
cout << endl;
cout << "*** before swap_cpy (int x, int y) *** " << endl;
cout << "x = " << x << ", " << "y = " << y << endl;
swap_cpy (x, y);
cout << "*** after swap_cpy (int x, int y) ***" << endl;
cout << "x = " << x << ", " << "y = " << y << endl;
cout << endl;
cout << "*** before swap_ptr (int *x, int *y) ***" << endl;
cout << "x = " << x << ", " << "y = " << y << endl;
swap_ptr (&x, &y);
cout << "*** after swap_cpy (int *x, int *y) ***" << endl;
cout << "x = " << x << ", " << "y = " << y << endl;
cout << endl;
cout << "*** before swap_ptr (int &x, int &y) ***" << endl;
cout << "x = " << x << ", " << "y = " << y << endl;
swap_ref (x, y);
cout << "*** after swap_cpy (int &x, int &y) ***" << endl;
cout << "x = " << x << ", " << "y = " << y << endl;
cout << endl;
}
int main ()
{
try_ref ();
return 0;
}
x = 1, y = 8
&x = 0x7fffee33dfac, &y = 0x7fffee33dfa8 // 实参地址
*** before swap_cpy (int x, int y) ***
x = 1, y = 8
--- swap_cpy (int a, int b) begins ---
a = 8, b = 1
&a = 0x7fffee33defc, &b = 0x7fffee33def8 // 形参地址,不同于实参地址
--- swap_cpy (int a, int b) ends ---
*** after swap_cpy (int x, int y) ***
x = 1, y = 8
*** before swap_ptr (int *x, int *y) ***
x = 1, y = 8
--- swap_cpy (int *a, int *b) begins ---
*a = 8, *b = 1
a = 0x7fffee33dfac, b = 0x7fffee33dfa8 // 指针变量的值,是实参地址
&a = 0x7fffee33def8, &b = 0x7fffee33def0 // 指针变量地址
--- swap_cpy (int *a, int *b) ends ---
*** after swap_cpy (int *x, int *y) ***
x = 8, y = 1
*** before swap_ptr (int &x, int &y) ***
x = 8, y = 1
--- swap_cpy (int &a, int &b) begins ---
a = 1, b = 8
&a = 0x7fffee33dfac, &b = 0x7fffee33dfa8 // 引用就是实参地址
--- swap_cpy (int &a, int &b) ends ---
*** after swap_cpy (int &x, int &y) ***
x = 1, y = 8
评论