aula08 structs e ponteiros.

doc Mac1222s2006 - BMAC - Marcilio

Aula 08 – Structs e ponteiros
Estruturas (struct) Já conhecemos os tipos simples do C: char, int, short, float, double, ... É possível construir-se um tipo composto de elementos destes tipos simples. Estrutura (struct) é uma coleção de uma ou mais variáveis, possivelmente de tipos diferentes, que podem ser manipuladas em separado ou em conjunto. Alguns exemplos: 1) variáveis x, y, z do tipo estrutura para conter o registro de funcionários da empresa: struct {int numero; char nome[40]; int cpf; double salario; } x, y, z; 2) variáveis d1 e d2 do tipo estrutura para conter uma data: struct {int dia; int mes; int ano; } d1, d2; 3) variável pt do tipo estrutura para conter as coordenadas de um ponto no plano: struct {double x; double y; } pt; Podemos dar um nome à estrutura sendo declarada e referenciar esse nome na declaração das variáveis: struct funcionario {int numero; char nome[40]; int cpf; double salario; }; struct funcionario x, y, z; // declara x, y, z struct data {int dia; int mes; int ano; }; struct data d1, d2; struct ponto {double x; double y; };
aula08 structs e ponteiros.doc Mac1222s2006 - BMAC - Marcilio

tabfunc[k].dia = 1. d1.48.BMAC .Marcilio struct ponto pt. while (x == y) { .. x. x.mes = 1. Vetores de estruturas A declaração: struct funcionario tabfunc[max_func].. aula08 structs e ponteiros.ano) . if (x == y) z = x else z = y. (ponto) da seguinte forma: <variável>. Como usar e como referenciar os elementos internos das estruturas? Para se referenciar um dos campos dentro de uma variável do tipo estrutura usa-se o operador .ano = 2001.numero = 235467.Marcilio .salario = 333.salario = y.. d1.BMAC .44. são exemplo de acesso aos elementos de tabfunc: tabfunc[i]...cpf == 8888888880) . } Para se referenciar um dos campos internos dentro de uma variável do tipo estrutura usa-se o operador .doc Mac1222s2006 . if (x.salario = 1035. pt. Declara um vetor em que cada elemento é uma estrutura do tipo funcionario.33.y = -56. Os seguintes comandos.ano > d2.numero = 12345.x = 2.aula08 structs e ponteiros.doc Mac1222s2006 . if (d1.salario.<campo> Alguns exemplos usando as declarações dos elementos acima: // uso da variáveis do tipo struct x = y... d1.34.<campo> // usar os elementos internos das variáveis tipo struct x. pt. (ponto) da seguinte forma: <variável>. d1 = d2.

struct data d. é o mesmo que d. Também um pouco mais intuitiva. i<max_func.numero = 123456. (*pf).cpf = 0. int cpf. Considere por exemplo a estrutura funcionario acima e a tabela tabfunc. j++) tabfunc[i].numero = 123456. pd->ano = 2001. é o mesmo que x.doc Mac1222s2006 . aula08 structs e ponteiros. Outra forma de usar ponteiro com estrutura é usar a abreviatura p-> para (*p).nome[j] = ’ ’. tabfunc[i].salario = 0.numero = 123456. char nome[40]. j.ano = 2001. (*pd). tabfunc[i]. (ponto).ano = 2001. struct funcionario x. *pd.Marcilio . pd = &d. struct funcionario {int numero. Vamos alocá-la com n elementos: #include <stdlib.BMAC . *pf.ano = 2001.Marcilio for (i=0.. é o mesmo que d. O motivo do parêntesis em (*pf) é a prioridade dos operadores * (estrela) e . } Ponteiros e estruturas Da mesma forma que outras variáveis. pf = &x.aula08 structs e ponteiros.h> main(){ int i. for (j=0. Estruturas e alocação dinâmica de memória Da mesma forma que outras variáveis a alocação de espaço em memória para estruturas pode ser feito dinamicamente com malloc e free. é o mesmo que x. A notação p-> é mais clara e um pouco menos carregada que a notação (*p).numero = -1. i++) { tabfunc[i]. Isso pode ser especialmente interessante no caso de estruturas.doc Mac1222s2006 .BMAC . podemos ter ponteiros para estruturas. n. j<40. Os comando acima ficam: pf->numero = 123456. onde cada elemento pode ocupar uma região grande de memória.

} // usa os n elementos de tabfunc . Se ela for do tipo struct.aula08 structs e ponteiros. (tabfunc+i)->cpf = 99999999999. j++) (tabfunc+i)->nome[j] = ‘x’. } Structs e tipo de funções Uma função pode ter como tipo uma struct.Marcilio . tabfunc[i].99. (*(tabfunc+i)). Veja o exemplo abaixo..salario = -999999. scanf(“%d”. onde usamos como tipo da função a struct ponto. pode devolver todos os valores internos à struct. j < 40. for (j = 0. } // outra forma de iniciar os n elementos de tabfunc for (i = 0. j++) tabfunc[i]. j < 40.BMAC . // le n // aloca n elementos para v tabfunc = (struct funcionario *) malloc(n*sizeof(struct funcionario)). i++){ tabfunc[i].numero = 0. (*(tabfunc+i)). &n). i < n. j++) (*(tabfunc+i)). (tabfunc+i)->salario = -999999. // inicia os n elementos de tabfunc for (i = 0.cpf = 99999999999.numero = 0.doc Mac1222s2006 . Isso até resolve o problema de uma função poder devolver em seu retorno (comando return) um só valor. } // outra forma de iniciar os n elementos de tabfunc for (i = 0.99. }.BMAC . j < 40. for (j = 0. i < n. aula08 structs e ponteiros. for (j = 0. i++){ (*(tabfunc+i)). i++){ (tabfunc+i)->numero = 0.doc Mac1222s2006 .cpf = 99999999999. struct funcionario *tabfunc. // libera os n elementos de tabfunc free(tabfunc).99. i < n.nome[j] = ‘x’.. tabfunc[i].nome[j] = ‘x’.Marcilio double salario.salario = -999999.

y-v.x)+(u. t. t. double b) { struct ponto t.1lf)".y+v.x = u.0). double y.aula08 structs e ponteiros.0.1lf. struct ponto v) { return sqrt((u. a = define_ponto(0.x)*(u. t.x = a. return t.%5. c.x+v.doc Mac1222s2006 .x-v. b = define_ponto(2. printf("\ndistancia = %5. c. c = soma_pontos(a.y-v.b)).h> struct ponto { double x.y = b.x.y). } aula08 structs e ponteiros. struct ponto define_ponto (double a.h> #include <math.BMAC .y)). }.y)*(u.doc Mac1222s2006 . } struct ponto soma_pontos (struct ponto u. 0. printf("\nsoma = (%5.Marcilio . struct ponto v) { struct ponto t. 2. } int main() { struct ponto a.BMAC . t.b).0).Marcilio #include <stdio.0.c.x-v.y.y = u.1lf". return t. } double distancia(struct ponto u.b. distancia(a.x.