2017-02-23 112 views
-1

我知道->运算符可以是变量方向的指针,但为什么用它的时候有指针运算符*,有什么区别,可以吗喜欢一个在另一个?例如:->运算符与指针之间的区别*(C++)

a*b 

指是指向B(好吧,我可能是错误的原谅我,因为我是一个初学者?)

是它等同于a->b

and a<-b含义b是指向?

如果是这样,是否有可能依靠->,因为它更简单?

+1

你似乎误解了什么' - >'手段。它并不意味着任何方向,它只是取消引用指向结构成员访问的结构的指针。对于一个指向结构'a'和成员'b'的指针,表达式'a-> b'等于'(* a).b'。 ***另外***' - >'运算符在C语言(它来自何处)早期意味着其他内容。阅读例如[这个老答案](http://stackoverflow.com/a/13366168/440558)了解更多详情。 –

+0

http://stackoverflow.com/a/6586248/6543574在这里解释,希望帮助:) – Lanfear

+2

'a * b' _never_意味着'a'是指向'b'的指针。最接近的含义是,作为声明的一部分,它意味着'b'是指向'a'的指针(其中'a'是_type_)。在表达式中,'a * b'调用乘法。我的歉意是 – davmac

回答

2

a*b通常表示“乘以ab”。 C++只有很少的词汇元素,其中很多都有很多不同的用途,所以上下文很重要。

a->b是成员访问权并对应于(*a).b,即访问由a指向的值的b成员。

请注意,*->运算符都可能被重载。

+0

我打算让它成为* b,例如int a * b –

+0

你的意思是'int a,* b;'? –

+0

@AhmedDhia:C++是空白不敏感的。 –

1

对我来说,你似乎对指针的功能和*所属的位置感到困惑。
指针是一种特殊类型的对象,指向另一个对象,而不是一个对象。
指针可以声明如下:

int *a; 

这里,*指定a是一个指针。指针类型与它们指向的对象的类型是不同的类型。
a指的是不确定的。您需要指定地址以使a指向某个东西。

int b = 2; 

而让ab

a = &b; 

这里,一元&运算符用于采取b的要做到这一点,让我们做一个整数(这里值2初始化) 地址。然后将其分配给a,然后a指向b
当然,指针也可以初始化。上面的语句可以更换:

int b = 2; 
int *a = &b; 

那么,你如何让b的从a价值?你可以做到这一点的提领a

std::cout << *a << std::endl; 

这将打印2。一元运算符*在此处用于解除引用a。这*是不同于*以上声明a并不应该混淆。

++*a; 

这增加了bb现在的值为3
可以通过分配另一个地址使a指向一个不同的对象:

int c = 3; 
a = &c; 

现在ac,而不是b
您可以将指针,这将指向同一个对象复制:

int *d = a; 

现在dc,这a也指出。

参考是从不同的指针:

int &e = b; 

&在这里用来指定e是一个参考。这&是不同于&用于采取地址,不应该混淆。这里,e是指b
他们一个对象,就好像它们是该对象总是行动:

++e; 

这增加bb现在的值为4
不同于指针引用必须总是指一个对象:

int &f; // error 

的参考还可以指一个指针:

int *&g = a; 

ga
但指针不能指向一个参考:

int &*h = &e; // error 
+0

非常感谢:)这清楚地表明了一个问题,但是,我如何防止打印内存地址或指针位置的输出? –

+0

你不应该给内存地址输出流。遵循上面的例子,'std :: cout << d << std :: endl'将输出'c'的地址。 –