Ajude nosso projeto a se manter online.

Arrays e Ponteiros de Structs em C++


 Neste tutorial de nossa apostila de C++, vamos aprender como trabalhar tanto com arrays como com ponteiros, usando structs.

Array de Structs

Assim como qualquer outro tipo de variável, o tipo que você definiu, usando structs, pode ser declarado na forma de array, ou seja, várias instâncias de structs.

Nos tutoriais anteriores, estamos usando a struct Student, instanciando apenas um aluno para nosso estudo. Mas qual escola, faculdade ou curso que você conhece que só tem um aluno? O normal é ter 20, 30, 50...

Então vamos lá, para declarar 50 structs do tipo Student, basta fazer:

  • Student alumns[50];

E prontinho, está declarado seu array de nome 'alumns', do tipo 'Student', com 50 elementos, onde o índice varia de 0 até 49.

Para acessar os nomes dos alunos, basta acessar as variáveis:

  • alumn[0].name
  • alumn[1].name
  • alumn[2].name
  • ...
  • alumn[49].name

Para acessar as notas de matemática dos alunos, basta acessar as variáveis:

  • alumn[0].math
  • alumn[1].math
  • alumn[2].math
  • ...
  • alumn[49].math

Podemos também, se quisermos, declarar e já inicializar as structs do array, por exemplo, para 3 alunos:
Student alumns[3] = {
                                    {"Neil Peart", 10, 10, 10},
                                    {"Geddy Lee", 9.1, 9.5, 9.2},
                                    {"Alex Lifeson", 2.5, 3.5, 4.7},
                                 };

Ponteiros para Structs

E, por fim, também podemos criar ponteiros especiais, que apontam para structs!
Por exemplo, para criar um ponteiro do tipo Student e de nome 'alumn':
  • Student *alumn;
Prontinho, temos um ponteiro do tipo Student. Agora vamos criar uma instância dessa struct:
  • Student s = { "Neil Peart", 10.0, 10.0, 10.0 };
Podemos fazer:
  • alumn = &s;

E prontinho, nosso ponteiro está apontando para uma variável do tipo Student. Podemos trabalhar e alterar essa instância através do ponteiro, se desejarmos.

Vamos mudar o nome do aluno, através do ponteiro, basta fazer:
  • *alumn.name = "Alex Lifeson";
Certo?
Errado!

O operador ponto . tem precedência ao operador *, logo, você vai estar acessando a referência para o membro 'alumn.name' e não para o ponteiro 'alumn'.

Assim, o correto é:
  • (*alumn).name = "Alex Lifeson";
Porém, fica muito feio e trabalhoso escrever desse jeito aí. Então, criaram um operador especial para usar em ponteiros de structs. A linha de código acima pode ser escrita assim:
  • alumn->name = "Alex Lifeson";
Prontinho. Usando o operador -> significa que estamos acessando o conteúdo do local para onde o ponteiro está apontando.

O código a seguir declara um array com 3 elementos do tipo Student, preenche seus campos um por um com um laço while, usando ponteiros, e depois exibe os dados dos alunos:
#include <iostream>
using namespace std;

int main()
{
    Student s[3], *ptr_s;
    int i;

    for(i=0 ; i<3 ; i++)
    {
        ptr_s=&s[i];

        cout << "Nome do aluno "<<i+1<<": ";
        cin.getline(ptr_s->name, 50);

        cout << "Nota de Matemática do aluno "<<i+1<<": ";
        cin >> ptr_s->math;

        cout << "Nota de Física do aluno "<<i+1<<": ";
        cin >> ptr_s->physics;

        cout << "Nota de Ciências do aluno "<<i+1<<": ";
        cin >> ptr_s->science;

        cin.ignore();
        cout << endl;
    }

    cout << endl;

    for(i=0 ; i<3 ; i++)
    {
        ptr_s=&s[i];
        cout << "Aluno "<<i+1<<": "<<ptr_s->name<<endl;
        cout << "Nota em Matemática "<<i+1<<": "<<ptr_s->math<<endl;
        cout << "Nota em Física "<<i+1<<": "<<ptr_s->physics<<endl;
        cout << "Nota em Ciências "<<i+1<<": "<<ptr_s->science<<endl;
        cout << endl;
    }

    return 0;
}

Nenhum comentário:

Postar um comentário