O que significa "->" na programação c / c ++?

"->" Este sinal é conhecido como operador de seta em C / C ++. Este sinal (->) fornece para acessar objetos em estruturas e uniões. Esses sinais são usados ​​principalmente em variáveis ​​de ponteiro para estruturar e uniões.

Sintaxe

Nome do ponteiro -> nome da variável

Esse operador para gerenciar o uso das estruturas ou a união do uso de ponteiros.

Exemplo

#incluir classe C { puxlic: int x;C () {x = 5; }};int main () { Cc = C (); C * x = & c; std :: cout << "cx =" << cx << "\ n"; std :: cout << "x-> x =" << x-> x << "\ n"; retornar 0;}

Isso dará a saída:

5

5

As respostas anteriores estão corretas, mas adicionarei outro caso quando o c ++ usar -> token:

modelo auto foo (Ta, T1 b) -> decltype (a + b)

O padrão C ++ desde 2011 usa isso como uma maneira alternativa e mais limpa de declarar o tipo de retorno da função. Primeiro, ele declara a função 'foo' com tipo deduzido automaticamente, pela palavra-chave 'auto', após a lista de parâmetros, você verá '->' seguido pelo tipo suposto real. Nesse caso, é o tipo de resultado para a operação (a + b). Como você vê, porque aeb são parâmetros da função, não haveria outra maneira de declarar esse tipo corretamente, mas no final do cabeçalho da função.

-> significa 'membro de desreferência e acesso'.

a-> b é equivalente a (* a) .b

É operador de acesso de membro. Simplificando, "->" permite o acesso a variáveis ​​de membro de uma estrutura, classe ou tipo de dado de união.

O C ++ permite que o usuário aloque memória para uma variável no tempo de compilação ou dinamicamente no tempo de execução. Quando a memória dinâmica é alocada para a estrutura, classe ou tipo de dados de união (usando métodos novos, malloc ou outros), o acesso às suas variáveis ​​membro é realizado usando o operador "->".

Quando a memória é alocada em tempo de compilação (declaração local / estática), as variáveis ​​de membro são acessadas usando o operador de ponto.

No caso de classes, somente membros ou métodos públicos podem ser acessados ​​usando o "->" ou "." operador.

Para ilustrar isso, consulte o seguinte exemplo -

#incluir usando espaço para nome std;classe Retângulo { int largura, altura; público: exemplo int; void set_values ​​(int, int); int area () {retornar largura * altura;}};void Rectangle :: set_values ​​(int x, int y) { largura = x; altura = y;}int main () { Retângulo * rectDynamic = new Rectangle (); rectDynamic -> set_values ​​(3,4); cout << "area:" << rectDynamic -> area (); rectDynamic-> exemplo = 0; delete rectDynamic; Retângulo rectStack; rectStack.set_values ​​(3,4); cout << "area:" << rectStack.area (); rectStack.example = 0;}

Quando você deseja acessar um membro de uma estrutura através de um ponteiro, primeiro é necessário desassociar o ponteiro.

Ou seja, se a é um ponteiro para uma estrutura na qual b é um membro, você acessa b com (* a) .b

Esta é uma ocorrência tão comum em C que existe uma abreviação: a-> b

"->" é referido como um operador de seta e é usado para remover a referência de um ponteiro, portanto a sintaxe é a mesma que (* ptr). Desreferenciar um ponteiro significa obter o valor desse endereço, por exemplo:

struct Person {

nome da string;

int idade;

};

Pessoa * Bob = nova pessoa;

Bob -> idade = 21;

Observe aqui como usamos o operador de seta para acessar a idade de Bob e atribuí-la ao valor de 21? Como desreferenciar um ponteiro significa obter o valor ou acessar o valor. Portanto, neste caso, estamos acessando o valor da idade, que atualmente não é inicializado (portanto, nesse endereço de memória, ele não contém nada, mas o espaço é alocado) e, em seguida, atribuímos um número inteiro de 4 bytes.

Certamente é verdade que

p-> a

é equivalente a

(* p) .a

Mas eu acrescentaria mais alguns detalhes. Antes de tudo, p é sempre um ponteiro (ou entidade semelhante a um ponteiro, como um iterador) neste contexto. Em C, um ponteiro pode muitas vezes apontar para uma instância de uma estrutura; em C ++, um ponteiro pode apontar para um objeto. É tão comum usar ponteiros para estruturas e objetos, o operador "flecha" (->) foi adicionado ao idioma para salvar algumas teclas pressionadas para esta operação de exclusão de referência e acesso ao ponteiro.

E, no entanto, isso salva apenas algumas teclas, talvez não o suficiente para justificar sua inclusão na lista de operadores C / C ++. A verdadeira razão para sua inclusão é que, em certos programas, é muito comum ter estruturas de lista e árvore vinculadas, como esta:

Nó struct { int val; Nó * próximo;} * raiz;

Dada essa definição, é comum referenciar o próximo nó na lista, e o próximo depois, etc., para que você possa ter um código como este:

raiz-> próximo-> próximo-> val = 100;

Isso significa: acesse o terceiro item da lista vinculada e atribua o valor 100. Esse código é definitivamente mais elegante e legível que o seguinte, além do número de pressionamentos de tecla salvos.

(* (* (* root) .next) .next) .val = 100;