250 likes | 367 Views
Linguagem de Programação 1. Estruturas e Tipos de Dados em C. Estruturas – Conceito. Uma estrutura ( struct ) é uma coleção de uma ou mais variáveis, possivelmente de tipos diferentes, agrupadas sob um único nome.
E N D
Linguagem de Programação 1 Estruturas e Tipos de Dados em C
Estruturas – Conceito • Uma estrutura (struct) é uma coleção de uma ou mais variáveis, possivelmente de tipos diferentes, agrupadas sob um único nome. • Estruturas constituem um recurso importante para organizar os dados utilizados por um programa pois trata um grupo de valores como uma única variável. • Estruturas são classificadas como variáveis compostas heterogêneas, pois podem agrupar variáveis de tipos diferentes. • Em contraposição, temos os vetores e matrizes, classificados como variáveis compostas homogêneas, pois somente agrupam variáveis do mesmo tipo.
Estruturas – Declaração • Exemplo de declaração de uma estrutura em C: struct ponto { int x; int y; }; • A palavra-chave struct informa ao compilador que um modelo de estrutura está sendo definido. • “ponto” é uma etiqueta que dá nome à definição da estrutura. • Uma definição de estrutura é um comando, por isso deve terminar em ponto-e-vírgula.
Estruturas – Declaração • Os nomes declarados entre as chaves são os campos (ou membros) da estrutura. • Os campos de uma mesma estrutura devem ter nomes diferentes. • Porém, estruturas diferentes podem conter campos com o mesmo nome. • A definição de uma estrutura não reserva qualquer espaço na memória. • Note que, no exemplo dado, nenhuma variável foi declarada de fato, apenas a forma dos dados foi definida. • Essa definição, porém, cria um novo tipo de dados, que pode ser usado para declarar variáveis.
Declarando uma variável de tipo estrutura • Duas maneiras de declarar a variável p do tipo ponto: struct ponto { int x; int y; }; ... struct ponto p; struct ponto { int x; int y; } p; ou • Dois comandos: • Defineestrutura • Declara variável da estrutura definida • Um comando: • Defineestrutura e declara variável da estrutura definida
Declarando uma estrutura utilizando typedef • Novos tipos de dados podem ser definidos utilizando-se a palavra-chave typedef. typedef structnome_da_estrutura { <tipo> campo_1; <tipo> campo_2; ... <tipo> campo_n; } nome_do_tipo;
Declarando uma estrutura utilizando typedef • Exemplo: • Com um typedef definido para a estrutura podemos utilizar apenas o nome do tipo (typedef) na declaração de uma variável (sem precisar usar a palavra-chave struct). typedef struct ponto { int x; int y; } tipoPonto; tipoPonto ponto_central;
Estruturas – Declaração • Os campos de uma estrutura podem ser de qualquer tipo, inclusive uma estrutura previamente definida. Sendo assim uma estrutura pode conter: • Tipos de dados simples (int, char, double, ...) • Vetores e Matrizes • Outras estruturas. • Porém, o tipo dos campos não podem ser o do próprio tipo que está sendo definido.
Estruturas – Declaração (Exemplos) struct tipo_endereco { char rua[50]; int numero; char bairro[20]; char cidade[30; char sigla_estado[3]; long int CEP; }; struct ficha_pessoal { char nome[50]; long int telefone; struct tipo_endereco endereco; };
Declarando uma estrutura • A definição do formato de uma estrutura pode ser feita dentro da função principal (main) ou fora dela. • Usualmente, declara-se fora da função principal, de modo que outras funções também possam “enxergar” a estrutura definida.
Acessando os campos de uma estrutura • Podemos acessar individualmente os campos de uma determinada estrutura como se fossem variáveis comuns. • A sintaxe para acessar e manipular campos de estruturas é a seguinte: <nome_da_variável_da_estrutura>.<campo>
Leitura dos campos de uma estrutura • A leitura dos campos de uma estrutura a partir do teclado deve ser feita campo a campo, como se fossem variáveis independentes. struct ficha_pessoal aluno; cout<<Digite o nome do aluno: ”; gets(aluno.nome); cout<<“Digite o telefone do aluno: ”; cin>>aluno.telefone; 1
Vetor de estruturas • Usado quando precisamos de diversas cópias de uma estrutura. • Por exemplo, cada aluno de uma turma constitui um elemento de um vetor, cujo tipo é uma estrutura de dados que define as características de cada aluno. struct etiqueta variável[dimensão]; 2
Atribuindo estruturas • Podemos atribuir uma variável de estrutura a outra variável da mesma estrutura: • Exemplo: • Neste caso todos os campos da estrutura primeira serão copiados para a segunda. • struct ficha_pessoal primeira, segunda; • //faz a leitura dos campos de primeira • segunda = primeira; //atribuição
Ponteiros para estruturas • Como outros tipos de dados, ponteiros para estruturas são declarados colocando-se o operador * na frente do nome da variável estrutura: struct ficha_pessoal *aluno; OU tficha *aluno;
Ponteiros para estruturas • Para acessar uma estrutura com ponteiros pode-se usar duas sintaxes: • Operador ponto: • Operador seta: *<ponteiro_estrutura>.<campo> <ponteiro_estrutura>-><campo> 3
Passando estruturas para funções • Podemos passar estruturas inteiras ou apenas campos destas como argumento para funções. • Tal passagem pode ser realizada por valor ou por referência. • As estruturas manipuladas por mais de uma função devem ser declaradas globalmente, antes da definição da função.
Passando estruturas para funções:: Passando campos por valor • Este processo é realizado da mesma forma que para variáveis simples, atentando-se para as peculiaridades das estruturas de dados. // Chamada funcao(estrutura.campo, ...); // Definicao formal <tipo> funcao(<tipo> variavel, ...)
Passando estruturas para funções:: Passando campos por referência • Da mesma forma que acontece para variáveis simples, deve-se pôr o operador & antes do nome da estrutura na chamada da função. // Chamada funcao(&estrutura.campo, ...); // Definicao formal <tipo> funcao(<tipo> *variavel, ...)
Passando estruturas para funções:: Passando estruturas inteiras por valor • Ao contrário de arrays, estruturas podem ser passadas por valor como argumentos de função. • Para estruturas grandes, há o problema da cópia de valores na pilha de memória. // Chamada funcao(estrutura, ...); // Definicao formal <tipo> funcao(struct <etiqueta> estrutura, ...) 4
Passando estruturas para funções:: Passando estruturas inteiras por referência • Permite alteração da estrutura sem necessidade de criação de uma cópia na memória. // Chamada funcao(&estrutura, ...); // Definicao formal <tipo> funcao(struct <etiqueta> *estrutura, ...) 5
Passando estruturas para funções:: Passando vetor de estruturas • Funciona de forma semelhante a vetor de variáveis simples. • Permite apenas passagem de parâmetros por referência, pois trata-se, afinal, de um vetor. // Chamada funcao(vetor, ...); // Definicao formal <tipo> funcao(struct <etiqueta> vetor[], ...)
Espaço alocado para uma estrutura struct aluno { char nome[4]; /* array 4 bytes */ short idade; /* 2 bytes */ char matricula[8]; /* array 8 bytes */ }; struct aluno al; Strcpy(al.nome, “Rui“); al.idade = 30; strcpy(al.matricula, "00/0001");
A função sizeof • A função sizeof(tipo) retorna o tamanho em bytes ocupado em memória pelo tipo de dado passado como parâmetro • Exemplo: • sizeof(int) => 2 bytes • sizeof(char) => 1 byte • sizeof(struct aluno) => 14 bytes • sizeof(struct aluno *) => 14 bytes 6