aula 2 definição de tipos estruturas e ponteiros
TRANSCRIPT
Aula 2
Definição de Tipos
Estruturas e Ponteiros
Estruturas (struct)
Agregados de Dados
de objetos elementares ou de outros agregados
de elementos homogêneos: array de elementos heterogêneos: struct
Estrutura
É uma coleção de variáveis referenciadas por um nome
Podemos armazenar as coordenadas (x,y) de um ponto
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
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
Nomeando uma Estrutura
Caso1:struct coordenadas{
int iX;int iY;
};struct coordenadas coord1, coord2;
Caso2:struct{
int iX;int iY;
} coord1, coord2;
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;
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
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}
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);
}
Acesso ao Ponteiro
O acesso ao ponteiro da estrutura é feito através do operador:
->
Definição de Tipos
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;
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
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;
Outro Exemplo
typedef struct funcionario{ int registro;
char nome[50];
unsigned int idade;
float salario;
}func;
void main()
{
func cadastro[30];
Outro Exemplo
typedef struct { int registro;
char nome[50];
unsigned int idade;
float salario;
} funcionario;
void main()
{
funcionario cadastro[30];
Exemplo sem utilizar typedep
struct funcionario{ int registro;
char nome[50];
unsigned int idade;
float salario;
} funcionario;
void main()
{
struct funcionario cadastro[30];
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 :-).
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...
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
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;
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.
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.
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;
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);
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;
Dicas sobre Ponteiro
Operações equivalentes
fVet[2] == *(fpVet + 2) &fVet[2] == (fpVet + 2)
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>
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
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()
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));
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.
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));
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);
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);