关于指针:ampersand(&)符号在C++中是如何工作的?

how does the ampersand(&) sign work in c++?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What are the differences between pointer variable and reference variable in C++?

这让我困惑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class CDummy
{
public:
   int isitme (CDummy& param);
};

int CDummy::isitme (CDummy& param)
{
  if (&param == this)
  {
       return true; //ampersand sign on left side??
  }
  else
  {    
       return false;
  }
}

int main ()
{
  CDummy a;
  CDummy* b = &a;

  if ( b->isitme(a) )
  {
    cout <<"yes, &a is b";
  }

  return 0;
}

在C&;中,通常表示变量的地址。这里它是什么意思?这是一种奇特的指针表示法吗?

我之所以假设它是指针表示法,是因为这毕竟是一个指针,我们正在检查两个指针是否相等。

我在cplusplus.com学习,他们有这个例子。


&的含义不止一个:

1)获取变量的地址

1
2
3
int x;
void* p = &x;
//p will now point to x, as &x is the address of x

2)通过引用函数传递参数

1
2
3
4
5
6
7
void foo(CDummy& x);
//you pass x by reference
//if you modify x inside the function, the change will be applied to the original variable
//a copy is not created for x, the original one is used
//this is preffered for passing large objects
//to prevent changes, pass by const reference:
void fooconst(const CDummy& x);

3)声明引用变量

1
2
3
4
5
int k = 0;
int& r = k;
//r is a reference to k
r = 3;
assert( k == 3 );

4)位与运算符

1
int a = 3 & 1; // a = 1

n)其他????


首先,请注意

1
this

是指向其所在类的特殊指针(=memory address)。首先,对象被实例化:

1
CDummy a;

接下来,将实例化一个指针:

1
CDummy *b;

接下来,将a的内存地址分配给指针b

1
b = &a;

接下来,调用方法CDummy::isitme(CDummy ¶m)

1
b->isitme(a);

在此方法中评估测试:

1
if (&param == this) // do something

这是棘手的部分。param是cdummy类型的对象,但¶m是param的内存地址。因此,将param的内存地址与另一个名为"this的内存地址进行测试。如果将调用此方法的对象的内存地址复制到该方法的参数中,这将导致true

这种评估通常在重载复制构造函数时完成

1
2
3
4
5
6
7
8
MyClass& MyClass::operator=(const MyClass &other) {
    // if a programmer tries to copy the same object into itself, protect
    // from this behavior via this route
    if (&other == this) return *this;
    else {
        // otherwise truly copy other into this
    }
}

还要注意*this的用法,其中this被取消引用。也就是说,不返回内存地址,而是返回位于该内存地址的对象。


作为函数CDummy::isitme的参数声明的CDummy& param实际上是一个"类似"指针但不同的引用。关于引用,需要注意的重要一点是,在作为参数传递函数的内部,您确实有一个对类型实例的引用,而不仅仅是指向它的指针。因此,在注释行中,"&;"的功能与C中的功能相同,它获取传入参数的地址,并将其与this进行比较,当然,这是指向调用该方法的类的实例的指针。