Ir para o conteúdo

Última atualização:2026-10-12

O operador de desreferência * em C++

0. Introdução

Normalmente, ao trabalhar com ponteiros, usamos o *, por exemplo:

int a = 1;
int *ptr = a;
std::cout << *ptr << std::endl;

Além disso, quais outros usos existem?

A resposta é sim: em C++, por exemplo, há ainda os três tipos a seguir:

  • ::*
  • .*
  • ->*

Você sabe o que cada um deles significa?

1.::*

O ::* é chamado de Pointer to member declarator (declarador de ponteiro para membro).

Vamos a um exemplo:

No exemplo a seguir, como você obteria o endereço de w_?

Se você escrever double * d = &w_;, será inválido, porque não se sabe onde w_ está; por isso é necessário um ponteiro para o declarador de membro, que permite fazer a ligação. Com esse ponteiro, já é possível acessar o membro. Continuemos com os dois próximos.

class Rectangle {
 public:
  double w_, h_;

  Rectangle(double w, double h) : w_(w), h_(h) {}
  double area() { return w_ * h_; }
};

int main() {
  Rectangle r{2.1, 3.2};
  double Rectangle::* w = &Rectangle::w_;
  r.*w = 2.2;
  std::cout << r.w_ << std::endl;
};

2..*

O .* é chamado de pointer to member of object (ponteiro para membro de objeto); este é fácil de entender: é o ponteiro que acessa membros de um objeto. Um ponteiro para membro permite referenciar membros não estáticos de um objeto de classe. Não é possível usar um ponteiro para membro para apontar para membros estáticos da classe, porque o endereço de um membro estático não está associado a nenhum objeto específico.

Por isso, no exemplo acima, essa linha de código altera o valor do membro w para 2.2.

r.*w = 2.2;

3.->*

O ->* é chamado de pointer to member of pointer (ponteiro para membro de ponteiro); este é ainda mais fácil de entender: é semelhante ao ., mas opera sobre o endereço de membros de um **objeto ponteiro*.

Assim, o exemplo correspondente passa a ser:

Rectangle r{2.1, 3.2}, *pr;
pr = &r;
std::cout << pr->*w << std::endl;

Para mais detalhes, consulte cppreference.com.

https://en.cppreference.com/w/cpp/language/pointer#Pointers_to_members

Ficou claro? Fim desta seção~

Tópicos relacionados

Comentários