38
Aula 2 Definição de Tipos Estruturas e Ponteiros

Aula 2 Definição de Tipos Estruturas e Ponteiros

Embed Size (px)

Citation preview

Page 1: Aula 2 Definição de Tipos Estruturas e Ponteiros

Aula 2

Definição de Tipos

Estruturas e Ponteiros

Page 2: Aula 2 Definição de Tipos Estruturas e Ponteiros

Estruturas (struct)

Page 3: Aula 2 Definição de Tipos Estruturas e Ponteiros

Agregados de Dados

de objetos elementares ou de outros agregados

de elementos homogêneos: array de elementos heterogêneos: struct

Page 4: Aula 2 Definição de Tipos Estruturas e Ponteiros

Estrutura

É uma coleção de variáveis referenciadas por um nome

Podemos armazenar as coordenadas (x,y) de um ponto

Page 5: Aula 2 Definição de Tipos Estruturas e Ponteiros

Estruturas

A palavra struct informa ao compilador que um modelo de estrutura está sendo definido.

Declaração:struct coordenadas

{

int iX;

int iY;

}; A estrutura contém 2 variáveis do tipo int, e é

chamada de coordenadas

Page 6: Aula 2 Definição de Tipos Estruturas e Ponteiros

Declaração

struct identificador{tipo1 nome1;tipo2 nome2;...tipoN nomeN;

} var_struct;

Pode conter um número arbitrário de dados de tipos diferentes

Pode-se nomear a estrutura para referencia-la O identificador ou var_struct podem ser omitidos

mas não ambos

Page 7: Aula 2 Definição de Tipos Estruturas e Ponteiros

Nomeando uma Estrutura

Caso1:struct coordenadas{

int iX;int iY;

};struct coordenadas coord1, coord2;

Caso2:struct{

int iX;int iY;

} coord1, coord2;

Page 8: Aula 2 Definição de Tipos Estruturas e Ponteiros

Acessar os dados de uma Estrutura

Acesso aos dados:var_struct.campo

//Atribuiçõescoord1.iX = 10;coord1.iY = 50;

coord2.iX = 15;coord2.iY = 25;

Page 9: Aula 2 Definição de Tipos Estruturas e Ponteiros

Operações com Estruturas

Inicializando uma estrutura:struct coordenadas coord1 = {15, 38};

Atribuição entre estruturas do mesmo tipo:struct coordenadas coord1 = {15, 38};

struct coordenadas coord2;

coord2 = coord1//coord2.iX = coord1.iX e coord2.iY = coord1.iY;

Os campos correspondentes das estruturas são automaticamente da origem para o destino

Page 10: Aula 2 Definição de Tipos Estruturas e Ponteiros

Passando Estruturas como Parâmetrosint iResult(struct coordenadas coord1){

int iSoma;iSoma = coord1.iX + coord1.iY;return(iSoma);

}

main(){

int iRet;struct coordenadas temp;temp.iX = 31;temp.iY = 3;

iRet = iResult(temp); //iRet = 34}

Page 11: Aula 2 Definição de Tipos Estruturas e Ponteiros

Passando Ponteiros de Estruturas com Parâmetros

void Pontos(struct coordenadas *coord){

coord->iX = 19;coord->iY = 85;

}

main(){

struct coordenadas Param;

Pontos(&Param);//X = 19 – Y = 85printf(“X = %i - Y = %i”, Param.iX, Param.iY);

}

Page 12: Aula 2 Definição de Tipos Estruturas e Ponteiros

Acesso ao Ponteiro

O acesso ao ponteiro da estrutura é feito através do operador:

->

Page 13: Aula 2 Definição de Tipos Estruturas e Ponteiros

Definição de Tipos

Page 14: Aula 2 Definição de Tipos Estruturas e Ponteiros

Definição de Tipos

O programador pode definir seus próprios tipos de dados tipos complexos usados da mesma forma que os

simples declaram-se variáveis utilizando-se esses novos

tipos Exemplo

typedef char tipo_nome [30];

tipo_nome nome;

Page 15: Aula 2 Definição de Tipos Estruturas e Ponteiros

Tipos definidos pelo usuário

Definição de tipo equivale a um padrão instanciado pela definição

de variáveis não incorpora novas operações de acesso ao

tipo operações: as mesmas dos elementos básicos

usados na construção do tipo

Page 16: Aula 2 Definição de Tipos Estruturas e Ponteiros

Typedef e Struct

Notação (“C”)typedef struct {

int registro;

char nome[50];

int idade;

float salario;

} tipo_funcionario;

Seu emprego

tipo_funcionario funcionario;

funcionario.idade = 35;

end_func = &funcionario;

Page 17: Aula 2 Definição de Tipos Estruturas e Ponteiros

Outro Exemplo

typedef struct  funcionario{ int registro;

                             char nome[50];

                             unsigned int idade;

                              float salario;

                            }func;

void main()

{

         func cadastro[30];

Page 18: Aula 2 Definição de Tipos Estruturas e Ponteiros

Outro Exemplo

typedef struct { int registro;

                             char nome[50];

                             unsigned int idade;

                              float salario;

                            } funcionario;

void main()

{

         funcionario cadastro[30];

Page 19: Aula 2 Definição de Tipos Estruturas e Ponteiros

Exemplo sem utilizar typedep

struct funcionario{ int registro;

                             char nome[50];

                             unsigned int idade;

                              float salario;

                            } funcionario;

void main()

{

         struct funcionario cadastro[30];

Page 20: Aula 2 Definição de Tipos Estruturas e Ponteiros

Ponteiros

Page 21: Aula 2 Definição de Tipos Estruturas e Ponteiros

Definição

Proporciona um modo de acesso a variáveis sem referenciá-las diretamente, utilizando para isto o endereço da variável.

A declaração “*” indica que uma variável é um ponteiro

Ps.: O uso descuidado de ponteiros pode levar a sérios bugs e a dores de cabeça terríveis :-).

Page 22: Aula 2 Definição de Tipos Estruturas e Ponteiros

Ponteiros Constantes

Não podem ser alterados e permanecem imutáveis durante a execução do programa.

Ex: int iNotas[10];

Para acessar a 1ª. posição do vetor pode-se usar: iNotas ou &iNotas[0]

2ª. Posição: &iNotas[1]

E assim sucessivamente...

Page 23: Aula 2 Definição de Tipos Estruturas e Ponteiros

Declaração de Ponteiro

<tipo> * <pnome_variavel>;

<tipo> Tipo da variável para a qual o ponteiro estará apontando (int, float, char, ...)

* Operador de indireção e indica que a variavel é um ponteiro para o <tipo> declarado

<nome_variavel> Nome da variável, seguindo as regras de criação de nomes

Page 24: Aula 2 Definição de Tipos Estruturas e Ponteiros

Declaração de Ponteiro

<tipo> * <pnome_variavel>;

Antes do nome da variável deve existir o *. É declarado junto com as outras variáveis

Exemplos int *ipPonteiro; float *fpPonteiro; char *cpPonteiro;

Page 25: Aula 2 Definição de Tipos Estruturas e Ponteiros

Criando um Ponteiro

Criar uma variável para armazenar o endereço da variável iVar1, a qual iremos chamar de ipVar1

Nesse momento a variável ipVar1 não foi inicializada, apenas foi reservado um espaço para ela.

Page 26: Aula 2 Definição de Tipos Estruturas e Ponteiros

Criando um Ponteiro

Devemos armazenar o endereço de iVar1 na variável ipVar1.

Nesse momento podemos dizer que ipVar1 aponta para iVar1 ou é um ponteiro para iVar1

Ps.: Ponteiro é uma variável que contém o endereço de outra variável.

Page 27: Aula 2 Definição de Tipos Estruturas e Ponteiros

Inicializando um Ponteiro

int *ipNum; // declaração de uma variável ponteiroint iNum, iNum2; // declaração de variáveis inteiras

ipNum = &iNum;

iNum = 50;

iNum2 = *ipNum;

*ipNum = 100;

Page 28: Aula 2 Definição de Tipos Estruturas e Ponteiros

Dicas sobre Ponteiro

Acessar o endereço da variável ponteiro fpPonteiro printf(“Endereço %f.”, fpPonteiro);

Acessar o conteúdo da variável ponteiro *fpPonteiro printf(“Conteúdo: %f.”, *fpPonteiro);

Page 29: Aula 2 Definição de Tipos Estruturas e Ponteiros

Dicas sobre Ponteiro

Acessar o próximopróximo endereço de um ponteiro fpVet++; fpVet = fpVet + n;//n=num de bytes a percorrer fpVet += n;

Acessar o endereço anterioranterior de um ponteiro fpVet--; fpVet = fpVet - n;//n=num de bytes a percorrer fpVet -= n;

Page 30: Aula 2 Definição de Tipos Estruturas e Ponteiros

Dicas sobre Ponteiro

Operações equivalentes

fVet[2] == *(fpVet + 2) &fVet[2] == (fpVet + 2)

Page 31: Aula 2 Definição de Tipos Estruturas e Ponteiros

Alocação Dinâmica

Aloca espaço na memória durante a execução do programa (em tempo de execução)

Existem funções para alocar, desalocar, realocar e limpar a memória que foi alocada

Usuar a biblioteca stdlib.h #include <stdlib.h>

Page 32: Aula 2 Definição de Tipos Estruturas e Ponteiros

Função: Sizeof

Indica o tamanho em bytes de uma variável. sizeof(<tipo>); Tipo: char, int, float, ...

printf(“Tam. int: %i.”, sizeof(int)); //4 bytes

printf(“Tam. float: %i.”, sizeof(float)); //4 bytes

printf(“Tam. double: %i.”, sizeof(double));//8 bytes

printf(“Tam. char: %i.”, sizeof(char)); //1 byte

Page 33: Aula 2 Definição de Tipos Estruturas e Ponteiros

Heap Área de Alocação Dinâmica

Consiste de toda a memória disponível que não foi usada para outro propósito.

“É o resto da memória” É possível alocar ou liberar dinamicamente a

memória do heap através da funções: malloc() calloc() realloc() free()

Page 34: Aula 2 Definição de Tipos Estruturas e Ponteiros

Função: Malloc

Aloca a quantidade de bytes desejada pelo usuário.

malloc(<tamanho>);

int *ipNum1, *ipNum2;

ipNum1 = (int *) malloc(4); //Aloca 4 bytes

//5 variáveis inteiras = 5 * 4 = 20 bytes

ipNum2 = malloc(5 * sizeof(int));

Page 35: Aula 2 Definição de Tipos Estruturas e Ponteiros

Função: Malloc

A expressão (int *) é utilizado pois a função malloc(), retorna um ponteiro para o tipo void, portanto esse ponteiro deve ser moldado para o tipo de dado apropriado.

É um operador unário chamado de operador molde ou cast.

Page 36: Aula 2 Definição de Tipos Estruturas e Ponteiros

Função: Calloc

Aloca memória para um grupo de objetos calloc(<tamanho>, <tam_obj);

int *ipNum1, *ipNum2;

ipNum1 = (int *) calloc(2, 4); //Aloca 8 bytes

//5 variáveis inteiras = 5 * 4 = 20 bytes

ipNum2 = (int *) calloc(5, sizeof(int));

Page 37: Aula 2 Definição de Tipos Estruturas e Ponteiros

Função: Realloc

Altera o tamanho de um bloco de memória que foi alocado através do malloc() ou do calloc()

realloc(<*ptr>, <tamanho>);int *ipNum1, *ipNum2;

ipNum1 = (int *) calloc(2, 4); //Aloca 8 bytes

//5 variáveis inteiras = 5 * 4 = 20 bytes

ipNum2 = (int *) calloc(5, sizeof(int));

ipNum2 = (int *) realloc(ipNum2, sizeof(int) * 10);

Page 38: Aula 2 Definição de Tipos Estruturas e Ponteiros

Função: Free Limpa um espaço de memória que foi alocado free(<*ptr>)

int *ipNum1, *ipNum2;

ipNum1 = (int *) calloc(2, 4); //Aloca 8 bytes

//5 variáveis inteiras = 5 * 4 = 20 bytes

ipNum2 = (int *) calloc(5, sizeof(int));

//Liberando a memória alocada para ipNum1 e ipNum2

free(ipNum1);

free(ipNum2);