16

我对 C++ 有点陌生,并尝试使用 Qt 来处理事情并遇到了这个令人困惑的事情:

各种教程的概念陈述如下:

Class *obj;

*obj- 将显示存储在引用内存中的对象的值
obj- 将是它指向的内存地址

所以,我会做类似的事情

*obj=new Class();

但是如果我想访问一个函数,我必须这样做obj->function1(); 而不是*obj->function1();

- 不知道为什么,因为普通对象 [ normalObj.function1();] 会起作用,因为这就是直接的价值。

那么,对于指针对象,为什么我们使用内存引用来访问函数,或者在普通对象的情况下,它总是引用

PS:有人可以指导我在 C++ 中使用指针的好教程,这样我的这些查询就可以直接在其中解决。

4

4 回答 4

35

*符号用于定义指针和取消引用指针。例如,如果我想创建一个指向 int 的指针,我可以这样做:

int *ptr;

在此示例中, the*用于声明 this 是指向 int的指针。现在,当您不声明指针并且将*符号与已声明的指针一起使用时,那么您正在取消引用它。您可能知道,指针只是一个地址。当您取消引用指针时,您将获得该地址指向的值。例如:

int pointToMe = 5;
int *ptr = &pointToMe;
std::cout << *ptr;

这将打印出 5。此外,如果您正在分配一个指向新地址的指针并且它不在声明中,则不要使用该*符号。所以:

int pointToMe = 5;
int *ptr;
ptr = &pointToMe;

你会怎么做。您还可以尊重指针以将新值分配给地址指向的值。如:

int pointToMe = 5;
int *ptr = &pointToMe;
std::cout << *ptr; // Prints out 5
*ptr = 27;
std::cout << *ptr; // Prints out 27

现在,->就像尊重符号一样。它将取消引用指针,然后像使用.非指针对象一样使用成员函数和变量。即使使用不是指针的对象,您也可以->通过首先获取地址来使用:

CObj object;
(&object)->MemberFunction();

这只是指针的简要概述,希望对您有所帮助。

于 2012-07-07T08:19:42.323 回答
7

您可以使用“正常”.来访问对象成员,但您必须先取消引用指针。

由于运算符优先级,这看起来像(*obj).member. 对于那些认为这写得太多的人来说,obj->member是一个更短的替代方案。

如果您有一个c类型为 的对象Class*c.ptr则意味着取消引用一个ptr属于Class. 这是 的一个原因(*obj).member,这意味着其他东西。

于 2012-07-07T08:18:47.330 回答
3

其实,你错了。你做:

obj=new Class();

或者

Class *obj = new Class;

这是完全不同的。

Class *obj;
*obj = new Class;

不会编译。

obj是 type Class*,所以这就是您可以分配给它的内容(以及new Class返回的内容)。

于 2012-07-07T07:29:16.857 回答
2

更准确地说,你可以这样做

Class  obj;
Class* obj_ptr;

obj_ptr = &obj;

// Now onwards you can use the pointer to access data members and function

obj_ptr->a = 10; // Like this
于 2015-08-18T07:02:22.500 回答