Baixe o app para aproveitar ainda mais
Prévia do material em texto
AULA de Struct e Ponteiro Tema: Unidade 3: Agregado Heterogêneo : Motivação e implementação de Pilha usando agregado heterogêneo. Unidade 4 : Ponteiros : Definição de ponteiro, Operador de endereço, operador de indireção e operador seta Objetivo: O aluno deverá ser capaz de : - compreender agregado heterogêneo (struct) - realizar tarefas práticas com structs e as estruturas de dados estudadas - conceituar ponteiro - compreender o uso de ponteiro no estudo de listas lineares - conceituar os operadores & e * - manipular ponteiro com os operadores & e * - compreender o uso do operador seta (->) - manipular struct através de ponteiro e do operador seta. Conteúdo - struct : motivação através de exemplos - struct : definição, declaração de variáveis, acesso aos campos e vetor de structs, através de exemplos. - desenvolvimento de tarefa prática com pilha e struct - motivação para o estudo de ponteiro com listas lineares - conceito de ponteiro, através de exemplos com os operadores * e &. - conceito e uso do operador seta com ponteiro e struct, através de exemplos. Suporte Conceitual struct : palavra reservada nas linguagens C e C++, que permite criar um tipo de dados definido pelo programador, agregando dados de tipos diferentes em campos. Como definir um tipo com struct ? Regra geral: struct <identificador > { <tipo1> <campo1>; <tipo2> <campo2>; ... <tipon> <campon>; }; onde identificador é o identificador da struct. Como declarar uma variável de um tipo struct ? Regra geral: 1ª forma ) struct <identificador> <lista de variáveis>; 2ª forma) <identificador> <lista de variáveis>; Como acessar um campo de uma struct ? Usando o operador ponto entre a variável struct e o campo que se deseja acessar. Regra geral: <variável struct> . <campo> Uma variável struct pode ser atribuída diretamente a outra variável struct do mesmo tipo, sem ser necessário fazer uma atribuição campo a campo. Ponteiro é uma variável que contém o endereço de memória de outra variável. Diz-se que o ponteiro “aponta” para a variável cujo endereço ele armazena. Representação gráfica de ponteiro : seta ou símbolo de aterramento (herdado da eletricidade), no caso do ponteiro ser nulo (NULL). Notas : 1) NULL é uma constante pré-definida na linguagem. 2) Aceita-se 0 ou NULL, quando se trata de ponteiros Declaração de ponteiro : Forma geral : <tipo> *<variável_ponteiro>; Operador de endereço : & Fornece o endereço de seu operando. Operador de indireção ou de referência : * Fornece o conteúdo da área apontada pelo ponteiro. Operador seta : (->) Permite acessar o campo de uma struct apontada por um ponteiro. Regra geral: <ponteiro> -> <campo> Exemplos: Exemplo 1 : struct aluno { int matricula; char nome[40]; float media; }; Definimos um tipo, mas é preciso declarar variáveis para armazenar os dados da aplicação. Então, como declarar uma variável do tipo struct aluno ? Em C++, fazemos : struct aluno x, y, z; ou apenas aluno x, y, z; Serão alocados na memória, espaço para 3 agregados de dados : x, y e z. Podemos visualizar, por exemplo, da seguinte forma : a) x.media = 9.5; // Define uma média específica x.matricula = 1205; // Define uma matrícula específica cout << “Matricula = “ << x.matricula; // Imprime a matrícula cout << “Media = “ << x.media; b) cout << “Digite o nome : “ ; cin.getline(x.nome,40); //obtém o nome via teclado cout << “Nome fornecido => “ << x.nome << endl; O mesmo poderá ser feito com as variáveis y e z. Exemplo 2 : struct livro { char titulo[60]; char categoria[30]; //suspense, ação, etc... float preco; }; Daí, é possível declarar, por exemplo : struct livro L1, L2; ou livro L1, L2; Pode-se fazer, por exemplo : L1.preco = 25.99; L2.preco = L1.preco + 10; Exemplo 3 : struct carta { char naipe[7]; int numero; }; Daí, é possível declarar, por exemplo : struct carta c1, c2; ou carta c1, c2; Pode-se fazer, por exemplo : c1.numero = 10; Ponteiro · Objetivo : Motivação para o uso de ponteiro Definir, através de exemplos, ponteiro e os operadores & e *. Definir através de exemplos o uso do operador seta (ponteiro para struct) Procedimento : Exemplo1: Ensina: Definição de ponteiro, operadores & e *. int x = 10, y, *p; //p é um ponteiro para int p = &x; //p recebe o endereço de x y = *p; // y recebe o conteúdo da área apontada por p cout << “x vale = “ << x << endl << “y vale = “ << y << endl << “*p vale = “ << *p << endl << “p vale = “ << p << endl; Exemplo 2: Ensina : Ponteiro recebe ponteiro e ponteiro nulo int x = 10, *p, *q, *r; p = &x; //p recebe o endereço de x q = p; *q = 20; // o conteúdo da área apontada por q recebe 20 r = NULL; // r recebe NULL cout << "x vale = " << x << endl << "*q vale = " << *q << endl << "*p vale = " << *p << endl << "p vale = " << p << endl << "q vale = " << q << endl << "r vale = " << r << endl; Comentário: 1) Como r é NULL, não tem sentido falar em *r, pois *r não existe. 2) NULL é uma constante pré-definida na linguagem. 3) Aceita-se 0 ou NULL, quando se trata de ponteiros Exemplo 3: Ensina : Ponteiro para struct #include <iostream> #include <cstdlib> using namespace std; // define um tipo struct aluno { int matricula; float media; }; int main() { // declara duas variáveis do tipo aluno aluno a, b; // declara um ponteiro para aluno aluno *p; a.matricula = 10; a.media = 6.8; p = &a; b = a; // atribui uma struct a outra (*p).matricula = 100; //acessa o campo matricula (*p).media = 9.5; cout << "Matricula de a = " << a.matricula << endl << "Media de a = " << a.media << endl; cout << "Matricula de b = " << b.matricula << endl << "Media de b = " << b.media << endl; system("pause"); } Exemplo 4: Ensina : Ponteiro para struct com operador seta #include <iostream> #include <cstdlib> using namespace std; // define um tipo struct aluno { int matricula; float media; }; int main() { // declara duas variáveis do tipo aluno aluno a, b; // declara um ponteiro para aluno aluno *p; a.matricula = 10; a.media = 6.8; p = &a; b = a; // atribui uma struct a outra p->matricula = 100; //acessa o campo matricula p->media = 9.5; cout << "Matricula de a = " << a.matricula << endl << "Media de a = " << a.media << endl; cout << "Matricula de b = " << b.matricula << endl << "Media de b = " << b.media << endl; system("pause"); }
Compartilhar