*和&的含义是什么?当应用于变量名称?

时间:2010-07-28 07:09:24

标签: c++ pointers reference c++-faq

在C ++中,有什么区别:

 void func(MyType&); // declaration

 //...
 MyType * ptr;

 func(*ptr); // compiler doesnt give error

 func(ptr); // compiler gives error i thought & represents memory address so 
            // this statement should correct as ptr is only a pointer
            // or address of some real var.

2 个答案:

答案 0 :(得分:23)

一元前缀运算符& ,应用于对象时,会生成 地址 对象:&obj
类型修饰符& ,当应用于即将声明的变量时,会将变量的类型修改为 引用类型< / em> int&

这同样适用于*:当作为 一元前缀运算符 应用于指针时,它将 取消引用 指针,产生对象:*ptr 当用作 类型修饰符 到即将声明的变量时,*会将类型修改为 指针 int*

以类似的方式,应用于正在声明的变量的 类型修饰符[] 会将变量的类型修改为数组,而二进制中缀运算符[] 将访问该数组的一个子对象。


类型修饰符适用于声明为 的变量,而不适用于声明它们的类型。例如,这个

int *p, **pp, i, a[10], &r = i; 

定义了一个int指针,一个指向int指针的指针,一个vanilla int,一个10 int的数组和一个int参考。 (后者立即被初始化,因为你不能有一个未初始化的引用。)注意 类型修饰符在语法上属于它们正在修改它的类型的声明变量 ,而不是声明变量的类型。不过,类型修饰符(*&)会修改变量的类型
但是,在下列情况下,pia被假定为已声明的变量

*pp = &i;
a[0] = i;

*&是一元前缀运算符,取消引用pp并产生i的地址,而[]产生第一个int对象在数组a中。

C和C ++不关心 类型修饰符 周围的空白这一事实,当它到来时会导致不同的阵营放置它们并不能让事情变得更容易 有些人将类型修饰符放在类型附近。他们认为它会修改类型,所以应该去那里:

int* ptr;

缺点是在声明多个对象时会变得混乱。此

int* a, b;

a定义为int的指针,但bint。这就是为什么有些人喜欢写

int *ptr;
int *a, *b;

我建议不要在同一个语句中声明多个对象。 IMO使代码更容易阅读。此外,它可以让你自由选择任何一个约定。


除了类型修饰符一元前缀运算符 &*之外,还要进一步复杂化,还有 二进制中缀运算符 &*,意思是“按位AND”和“乘法”。并且为了增加侮辱伤害,在C ++中你可以 overload 一元前缀二进制中缀这些运算符的变体(以及二进制中缀 [])用于用户定义的类型,并且对于它们的语义完全免费。

答案 1 :(得分:4)

的MyType&安培;表示/ reference /,与指针完全不同的野兽。如果您的函数原型是

FUNC(的MyType);

您将使用函数内部参数的副本。随着

FUNC(的MyType&安培);

您正在使用对象本身(即,在调用范围和被调用范围内的同一对象)。对于这种情况,它就像使用指针但使用与对象相同的“点”语法。

当然,这是一个浅薄而简单的解释。对于我来说,抓住指针下方的深渊,参考资料和其他部落需要数年时间。