SlideShare uma empresa Scribd logo
1 de 38
Baixar para ler offline
Prof. Adriano Teixeira de Souza
   A memória de qualquer computador é uma
    seqüência de bytes.

   Cada byte pode armazenar um número
    inteiro entre 0 e 255.

   Cada byte na memória é identificado por um
    endereço numérico, independente do seu
    conteúdo.
Conteúdo        Endereço



    0000 0001   0x0022FF16



    0001 1001   0x0022FF17



    0101 1010   0x0022FF18



    1111 0101   0x0022FF19



    1011 0011   0x0022FF1A
   Cada objeto (variáveis, strings, vetores, etc.) que
    reside na memória do computador ocupa um certo
    número de bytes:
    ◦ Inteiros:           4 bytes consecutivos
    ◦ Caracteres:         1 byte
    ◦ Ponto-flutuante:    4 bytes consecutivos

   Cada objeto tem um endereço.

   Na arquitetura IA-32 (Intel), o endereço é do byte
    menos significativo do objeto.
Variável                        Endereço
                     Valor
                        0001 1001
                                    0x0022FF24
   char string1[4]      0101 1010
                        1111 0101
                        1011 0011
                        0000 0001   0x0022FF14
                        0001 1001
                        0101 1010
                        1111 0101
                        1011 0011
                        0000 0001
                        0001 1001
 float real[4]          0101 1010
                        1111 0101
                        1011 0011
                        0000 0001
                        0001 1001
                        0101 1010
                        1111 0101
                        1011 0011
                        0000 0001
                        0001 1001   0x0022FF10
char string[4]          0101 1010
                        1111 0101
                        1011 0011
int x = 100;

   Ao declararmos uma variável x como acima, temos
    associados a ela os seguintes elementos:
    ◦ Um nome (x)
    ◦ Um endereço de memória ou referência (0xbfd267c4)
    ◦ Um valor (100)
   Para acessarmos o endereço de uma variável,
    utilizamos o operador &
   Um ponteiro (apontador ou pointer) é um tipo
    especial de variável cujo valor é um endereço.

   Um ponteiro pode ter o valor especial NULL,
    quando não contém nenhum endereço.

   NULL é uma constante definida na biblioteca
    stdlib.h.
*var

   A expressão acima representa o conteúdo do
    endereço de memória guardado na variável
    var

   Ou seja, var não guarda um valor, mas sim
    um endereço de memória.
*var


   O símbolo * acima é conhecido como
    operador de indireção.

   A operação acima é conhecida como
    desreferenciamento do ponteiro var.
int x;
int *ap;    // apontador para inteiros
ap = &x;    // ap aponta para x



                0000 0000 (00)    0x0022FF14

           ap   0010 0010 (22)
                 1111 1111 (FF)
                0001 0000 (10)
                   0000 0001      0x0022FF10

           x       0001 1001
                   0101 1010
                   1111 0101
   Há vários tipos de ponteiros:
    ◦   ponteiros   para   caracteres
    ◦   ponteiros   para   inteiros
    ◦   ponteiros   para   ponteiros para inteiros
    ◦   ponteiros   para   vetores
    ◦   ponteiros   para   estruturas

   O compilador C faz questão de saber de que tipo
    de ponteiro você está definindo.
int      *ap_int;      //   apontador   para   int
char     *ap_char;     //   apontador   para   char
float    *ap_float;    //   apontador   para   float
double   *ap_double;   //   apontador   para   double

// apontador para apontador
int          **ap_ap_int;
   Um conjunto limitado de operação
    aritméticas pode ser executado.

   Os ponteiros são endereços de memória.
    Assim, ao somar 1 a um ponteiro, você estará
    indo para o próximo endereço de memória do
    tipo de dado especificado.
int    *ap;




00         00      00
22         22      22
FF         FF      FF
18         14      10


ap         ap+1    ap+2
   Sempre que somar ou subtrair ponteiros,
    deve-se trabalhar com o tamanho do tipo de
    dado utilizado.

   Para isso você pode usar o operador
    sizeof().
   O nome de uma matriz é, na verdade, um ponteiro
    para o primeiro elemento da matriz (endereço
    base)

   Assim, temos duas formas de indexar os elementos
    de uma matriz ou vetor:
    ◦ Usando o operador de indexação (v[4])
    ◦ Usando aritmética de endereços (*(ap_v + 4))
   Ponteiros podem ser organizados em matrizes
    como qualquer outro tipo de dado.

   Nesse caso, basta observar que o operador * tem
    precedência menor que o operador de indexação
    [].


        int *vet_ap[5];
        char *vet_cadeias[5];
   Normalmente, são utilizadas como ponteiros para
    strings, pois uma string é essencialmente um
    ponteiro para o seu primeiro caractere.

     void   systax_error(int num)
     {
            char *erro[] = {
                  "Arquivo nao pode ser aberton",
                  "Erro de leituran",
                  "Erro de escritan",
                  "Falha de midian"};
            printf("%s", erro[num]);
     }
   Um ponteiro para uma função contém o endereço
    da função na memória.

   Da mesma forma que um nome de matriz, um
    nome de função é o endereço na memória do
    começo do código que executa a tarefa da função.

   O uso mais comum de ponteiros para funções é
    permitir que uma função possa ser passada como
    parâmetro para uma outra função.
   Ponteiros de função podem ser:
    ◦   atribuídos a outros ponteiros,
    ◦   passados como argumentos,
    ◦   retornados por funções, e
    ◦   armazenados em matrizes.
   Funções que devolvem ponteiros funcionam da
    mesma forma que os outros tipos de funções

   Alguns detalhes devem ser observados:
    ◦ Ponteiros não são variáveis
    ◦ Quando incrementados, eles apontam para o próximo
      endereço do tipo apontado
    ◦ Por causa disso, o compilador deve saber o tipo apontado
      por cada ponteiro declarado
    ◦ Portanto, uma função que retorna ponteiro deve declarar
      explicitamente qual tipo de ponteiro está retornando
<tipo>    *funcao(.....)
           {
                    ....
                    return (ponteiro);
           }




<tipo> não pode ser void, pois:
• Função deve devolver algum valor
• Ponteiro deve apontar para algum tipo de dado
   Um programa, ao ser executado, divide a memória
    do computador em quatro áreas:
    ◦ Instruções – armazena o código C compilado e montado em
      linguagem de máquina.
    ◦ Pilha – nela são criadas as variáveis locais.
    ◦ Memória estática – onde são criadas as variáveis globais e
      locais estáticas.
    ◦ Heap – destinado a armazenar dados alocados
      dinamicamente.
Instruções



Dados estáticos
                  Embora seu tamanho seja
                  desconhecido, o heap geralmente
Dados dinâmicos   contém uma quantidade
    (Heap)        razoavelmente grande de
                  memória livre.




     Pilha
   As variáveis da pilha e da memória estática
    precisam ter tamanho conhecido antes do
    programa ser compilado.

   A alocação dinâmica de memória permite reservar
    espaços de memória de tamanho arbitrário e
    acessá-los através de apontadores.

   Desta forma, podemos escrever programas mais
    flexíveis, pois nem todos os tamanhos devem ser
    definidos aos escrever o programa.
   A alocação e liberação desses espaços de
    memória é feito por duas funções da
    biblioteca stdlib.h:
    ◦ malloc(): aloca um espaço de memória.
    ◦ free(): libera um espaço de memória.
   Abreviatura de memory allocation
   Aloca um bloco de bytes consecutivos na memória
    e devolve o endereço desse bloco.
   Retorna um ponteiro do tipo void.
   Deve-se utilizar um cast (modelador) para
    transformar o ponteiro devolvido para um ponteiro
    do tipo desejado.
   Exemplo:
    Alocando um vetor de n elementos do tipo inteiro.




     int *p;
     p = (int*) malloc(n * sizeof(int));
   A memória não é infinita. Se a memória do
    computador já estiver toda ocupada, a função
    malloc não consegue alocar mais espaço e devolve
    NULL.

   Usar um ponteiro nulo travará o seu computador
    na maioria dos casos.
   Convém verificar essa possibilidade antes de
    prosseguir.




     ptr = (int*) malloc (1000*sizeof(int));
     if (ptr == NULL)
     {
            printf ("Sem memorian");
     }
     ...
   Libera o uso de um bloco de memória, permitindo
    que este espaço seja reaproveitado.

   O mesmo endereço retornado por uma chamada da
    função malloc() deve ser passado para a função
    free().

   A determinação do tamanho do bloco a ser
    liberado é feita automaticamente.
   Exemplo: liberando espaço ocupado por um vetor
    de 100 inteiros




     int *p;
     p = (int*) malloc(100 * sizeof(int));
     free(p);
   Essa função faz um bloco já alocado crescer ou
    diminuir, preservando o conteúdo já existente:

(tipo*) realloc(tipo *apontador, int novo_tamanho)



    int *x, i;
    x = (int *) malloc(4000*sizeof(int));
    for(i=0;i<4000;i++) x[i] = rand()%100;

    x = (int *) realloc(x, 8000*sizeof(int));

    x = (int *) realloc(x, 2000*sizeof(int));
    free(x);
int *x, i;
x = (int *) malloc(4000*sizeof(int));
                                        x
for(i=0;i<4000;i++) x[i] =
rand()%100;                             x


x = (int *) realloc(x,
                                        x
8000*sizeof(int));

x = (int *) realloc(x,                  x
2000*sizeof(int));
free(x);                                x
#include<stdio.h>
typedef struct
{
   int dia, mes, ano;
} data;
int main (void)
{
   printf ("sizeof (data) = %dn", sizeof (data));
   printf ("sizeof (data *) = %dn", sizeof (data *));
   return 0;
}

                          Prof. Adriano Teixeira de Souza
Prof. Adriano Teixeira de Souza
   Analisando o programa mostrado vemos que não
    se sabe a quantidade de valores que a pessoa vai
    inserir no vetor por esse motivo declaramos um
    vetor muito grande.
   O problema está se a pessoa, por exemplo,
    deseja colocar apenas 3 elementos no vetor.
   Como o vetor foi declarado com o tamanho igual
    a 100, o que acontece é o desperdício de
    memória e caso passe de 100 haverá um estouro.
   Portanto a melhor solução seria utilizar alocação
    dinâmica, ou seja, toda vez que não se sabe ao
    certo a quantidade de elementos a serem
    utilizados deve-se utilizar a alocação dinâmica.


                          Prof. Adriano Teixeira de Souza
Prof. Adriano Teixeira de Souza

Mais conteúdo relacionado

Mais procurados

Aula 4 - Diagrama Entidade Relacionamento (com exercício no final)
Aula 4  - Diagrama Entidade Relacionamento (com exercício no final)Aula 4  - Diagrama Entidade Relacionamento (com exercício no final)
Aula 4 - Diagrama Entidade Relacionamento (com exercício no final)Janynne Gomes
 
Banco de Dados - Introdução - Projeto de Banco de Dados - DER
Banco de Dados - Introdução - Projeto de Banco de Dados - DERBanco de Dados - Introdução - Projeto de Banco de Dados - DER
Banco de Dados - Introdução - Projeto de Banco de Dados - DERRangel Javier
 
Introdução a modelagem de dados - Banco de Dados
Introdução a modelagem de dados - Banco de DadosIntrodução a modelagem de dados - Banco de Dados
Introdução a modelagem de dados - Banco de Dadosinfo_cimol
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
Mer - Modelo Entidade Relacionamento
Mer - Modelo Entidade RelacionamentoMer - Modelo Entidade Relacionamento
Mer - Modelo Entidade RelacionamentoRademaker Siena
 
BD I - Aula 04 A - Resumo MER e Mapeamento Relacional
BD I - Aula 04 A - Resumo MER e Mapeamento RelacionalBD I - Aula 04 A - Resumo MER e Mapeamento Relacional
BD I - Aula 04 A - Resumo MER e Mapeamento RelacionalRodrigo Kiyoshi Saito
 
Estrutura de Dados - Aula de revisão de C na prática
Estrutura de Dados - Aula de revisão de C na práticaEstrutura de Dados - Aula de revisão de C na prática
Estrutura de Dados - Aula de revisão de C na práticaLeinylson Fontinele
 
Estrutura de Dados Aula 07 - Alocação dinâmica de memória
Estrutura de Dados Aula 07 - Alocação dinâmica de memóriaEstrutura de Dados Aula 07 - Alocação dinâmica de memória
Estrutura de Dados Aula 07 - Alocação dinâmica de memóriaLeinylson Fontinele
 
Desenvolvimento Web com PHP - Aula 1
Desenvolvimento Web com PHP - Aula 1Desenvolvimento Web com PHP - Aula 1
Desenvolvimento Web com PHP - Aula 1Thyago Maia
 
Introdução básica ao JavaScript
Introdução básica ao JavaScriptIntrodução básica ao JavaScript
Introdução básica ao JavaScriptCarlos Eduardo Kadu
 

Mais procurados (20)

Aula 4 - Diagrama Entidade Relacionamento (com exercício no final)
Aula 4  - Diagrama Entidade Relacionamento (com exercício no final)Aula 4  - Diagrama Entidade Relacionamento (com exercício no final)
Aula 4 - Diagrama Entidade Relacionamento (com exercício no final)
 
Linguagem C - Vetores
Linguagem C - VetoresLinguagem C - Vetores
Linguagem C - Vetores
 
Banco de Dados - Introdução - Projeto de Banco de Dados - DER
Banco de Dados - Introdução - Projeto de Banco de Dados - DERBanco de Dados - Introdução - Projeto de Banco de Dados - DER
Banco de Dados - Introdução - Projeto de Banco de Dados - DER
 
Arquitetura MVC
Arquitetura MVCArquitetura MVC
Arquitetura MVC
 
Estrutura de dados - Árvores Binárias
Estrutura de dados - Árvores BináriasEstrutura de dados - Árvores Binárias
Estrutura de dados - Árvores Binárias
 
Introdução a modelagem de dados - Banco de Dados
Introdução a modelagem de dados - Banco de DadosIntrodução a modelagem de dados - Banco de Dados
Introdução a modelagem de dados - Banco de Dados
 
Java script aula 04 - objeto array
Java script   aula 04 - objeto arrayJava script   aula 04 - objeto array
Java script aula 04 - objeto array
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Mer - Modelo Entidade Relacionamento
Mer - Modelo Entidade RelacionamentoMer - Modelo Entidade Relacionamento
Mer - Modelo Entidade Relacionamento
 
BD I - Aula 04 A - Resumo MER e Mapeamento Relacional
BD I - Aula 04 A - Resumo MER e Mapeamento RelacionalBD I - Aula 04 A - Resumo MER e Mapeamento Relacional
BD I - Aula 04 A - Resumo MER e Mapeamento Relacional
 
Linguagem C 06 Funcoes
Linguagem C 06 FuncoesLinguagem C 06 Funcoes
Linguagem C 06 Funcoes
 
Aula 09 - introducao oo
Aula 09 - introducao ooAula 09 - introducao oo
Aula 09 - introducao oo
 
03 mer2
03 mer203 mer2
03 mer2
 
Estrutura de Dados - Aula de revisão de C na prática
Estrutura de Dados - Aula de revisão de C na práticaEstrutura de Dados - Aula de revisão de C na prática
Estrutura de Dados - Aula de revisão de C na prática
 
Pilha e filas
Pilha e filasPilha e filas
Pilha e filas
 
Estrutura de Dados Aula 07 - Alocação dinâmica de memória
Estrutura de Dados Aula 07 - Alocação dinâmica de memóriaEstrutura de Dados Aula 07 - Alocação dinâmica de memória
Estrutura de Dados Aula 07 - Alocação dinâmica de memória
 
Aula 5 banco de dados
Aula 5   banco de dadosAula 5   banco de dados
Aula 5 banco de dados
 
Desenvolvimento Web com PHP - Aula 1
Desenvolvimento Web com PHP - Aula 1Desenvolvimento Web com PHP - Aula 1
Desenvolvimento Web com PHP - Aula 1
 
Pascal Arquivos
Pascal ArquivosPascal Arquivos
Pascal Arquivos
 
Introdução básica ao JavaScript
Introdução básica ao JavaScriptIntrodução básica ao JavaScript
Introdução básica ao JavaScript
 

Destaque

Instalacao ubuntu
Instalacao ubuntuInstalacao ubuntu
Instalacao ubuntuPepe Rocker
 
SO-05 Gerenciamento de Memória e Alocação
SO-05 Gerenciamento de Memória e AlocaçãoSO-05 Gerenciamento de Memória e Alocação
SO-05 Gerenciamento de Memória e AlocaçãoEduardo Nicola F. Zagari
 
Estrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentaisEstrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentaisFabrício Lopes Sanchez
 
Alocação Dinâmica em Linguagem C
Alocação Dinâmica em Linguagem CAlocação Dinâmica em Linguagem C
Alocação Dinâmica em Linguagem CGlécio Rodrigues
 
Aplicações multicore com Linux Embarcado usando Raspberry Pi 2 - TDC2015
Aplicações multicore com Linux Embarcado usando Raspberry Pi 2 - TDC2015Aplicações multicore com Linux Embarcado usando Raspberry Pi 2 - TDC2015
Aplicações multicore com Linux Embarcado usando Raspberry Pi 2 - TDC2015André Curvello
 
Livro "Curso de Direito do Trabalho" de Maurício Godinho Delgado - Capítulos ...
Livro "Curso de Direito do Trabalho" de Maurício Godinho Delgado - Capítulos ...Livro "Curso de Direito do Trabalho" de Maurício Godinho Delgado - Capítulos ...
Livro "Curso de Direito do Trabalho" de Maurício Godinho Delgado - Capítulos ...Contatonalua
 
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...Leinylson Fontinele
 
Estrutura de dados em Java - Ponteiros e Alocação de Memória
Estrutura de dados em Java - Ponteiros e Alocação de Memória Estrutura de dados em Java - Ponteiros e Alocação de Memória
Estrutura de dados em Java - Ponteiros e Alocação de Memória Adriano Teixeira de Souza
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Rodrigo Kono
 
Como diagramar o seu livro
Como diagramar o seu livroComo diagramar o seu livro
Como diagramar o seu livroRicardo Almeida
 
Gerenciamneto de projetos captação de pó
Gerenciamneto de projetos captação de póGerenciamneto de projetos captação de pó
Gerenciamneto de projetos captação de póSérgio Valadão
 
Neuropsicologia hoje
Neuropsicologia hojeNeuropsicologia hoje
Neuropsicologia hojeHamarmoises
 

Destaque (16)

Instalacao ubuntu
Instalacao ubuntuInstalacao ubuntu
Instalacao ubuntu
 
SO-05 Gerenciamento de Memória e Alocação
SO-05 Gerenciamento de Memória e AlocaçãoSO-05 Gerenciamento de Memória e Alocação
SO-05 Gerenciamento de Memória e Alocação
 
Estrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentaisEstrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentais
 
Apostila de Alocação Dinâmica em C
Apostila de Alocação Dinâmica em CApostila de Alocação Dinâmica em C
Apostila de Alocação Dinâmica em C
 
Listas Encadeadas
Listas EncadeadasListas Encadeadas
Listas Encadeadas
 
Alocação Dinâmica em Linguagem C
Alocação Dinâmica em Linguagem CAlocação Dinâmica em Linguagem C
Alocação Dinâmica em Linguagem C
 
Aplicações multicore com Linux Embarcado usando Raspberry Pi 2 - TDC2015
Aplicações multicore com Linux Embarcado usando Raspberry Pi 2 - TDC2015Aplicações multicore com Linux Embarcado usando Raspberry Pi 2 - TDC2015
Aplicações multicore com Linux Embarcado usando Raspberry Pi 2 - TDC2015
 
Livro "Curso de Direito do Trabalho" de Maurício Godinho Delgado - Capítulos ...
Livro "Curso de Direito do Trabalho" de Maurício Godinho Delgado - Capítulos ...Livro "Curso de Direito do Trabalho" de Maurício Godinho Delgado - Capítulos ...
Livro "Curso de Direito do Trabalho" de Maurício Godinho Delgado - Capítulos ...
 
Processo Penal Ordinario
Processo Penal OrdinarioProcesso Penal Ordinario
Processo Penal Ordinario
 
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...
 
Estrutura de dados em Java - Ponteiros e Alocação de Memória
Estrutura de dados em Java - Ponteiros e Alocação de Memória Estrutura de dados em Java - Ponteiros e Alocação de Memória
Estrutura de dados em Java - Ponteiros e Alocação de Memória
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)
 
Como diagramar o seu livro
Como diagramar o seu livroComo diagramar o seu livro
Como diagramar o seu livro
 
Lógica Proposicional
Lógica ProposicionalLógica Proposicional
Lógica Proposicional
 
Gerenciamneto de projetos captação de pó
Gerenciamneto de projetos captação de póGerenciamneto de projetos captação de pó
Gerenciamneto de projetos captação de pó
 
Neuropsicologia hoje
Neuropsicologia hojeNeuropsicologia hoje
Neuropsicologia hoje
 

Semelhante a Estrutura de Dados - Alocação dinâmica de memória

Semelhante a Estrutura de Dados - Alocação dinâmica de memória (20)

Conceitos de ponteiros struct e buffers
Conceitos de ponteiros struct e buffersConceitos de ponteiros struct e buffers
Conceitos de ponteiros struct e buffers
 
Ud3
Ud3Ud3
Ud3
 
Ed1
Ed1Ed1
Ed1
 
Aula04 ponteiros e conversao
Aula04   ponteiros e conversaoAula04   ponteiros e conversao
Aula04 ponteiros e conversao
 
Resumo tipo primitivo_java
Resumo tipo primitivo_javaResumo tipo primitivo_java
Resumo tipo primitivo_java
 
Estruturas
EstruturasEstruturas
Estruturas
 
Cool 3 assembly para linux
Cool 3   assembly para linuxCool 3   assembly para linux
Cool 3 assembly para linux
 
Linguagem C - Ponteiros
Linguagem C - PonteirosLinguagem C - Ponteiros
Linguagem C - Ponteiros
 
Aula 6 pc - slides
Aula 6   pc - slidesAula 6   pc - slides
Aula 6 pc - slides
 
Função malloc
Função mallocFunção malloc
Função malloc
 
Linguagem_C.pdf
Linguagem_C.pdfLinguagem_C.pdf
Linguagem_C.pdf
 
Estrutura de Dados - Procedimentos e Funções
Estrutura de Dados - Procedimentos e FunçõesEstrutura de Dados - Procedimentos e Funções
Estrutura de Dados - Procedimentos e Funções
 
RevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptxRevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptx
 
Pged 02
Pged 02Pged 02
Pged 02
 
Aula 10 de algoritmos com raciocínio lógico e desenvolvimento de código
Aula 10 de algoritmos com raciocínio lógico e desenvolvimento de códigoAula 10 de algoritmos com raciocínio lógico e desenvolvimento de código
Aula 10 de algoritmos com raciocínio lógico e desenvolvimento de código
 
Introducao Google GO
Introducao Google GOIntroducao Google GO
Introducao Google GO
 
Pged 01
Pged 01Pged 01
Pged 01
 
Aula 1
Aula 1Aula 1
Aula 1
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dados
 
Apostila estrutura de dados 2
Apostila estrutura de dados 2Apostila estrutura de dados 2
Apostila estrutura de dados 2
 

Mais de Adriano Teixeira de Souza

Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...
Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...
Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...Adriano Teixeira de Souza
 
Estrutura de dados em Java - Árvores Binárias
Estrutura de dados em Java - Árvores BináriasEstrutura de dados em Java - Árvores Binárias
Estrutura de dados em Java - Árvores BináriasAdriano Teixeira de Souza
 
Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Adriano Teixeira de Souza
 
Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)Adriano Teixeira de Souza
 
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)Adriano Teixeira de Souza
 
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)Adriano Teixeira de Souza
 
Estrutura de Dados em Java (Revisão de Algoritimos em Java)
Estrutura de Dados em Java (Revisão de Algoritimos em Java)Estrutura de Dados em Java (Revisão de Algoritimos em Java)
Estrutura de Dados em Java (Revisão de Algoritimos em Java)Adriano Teixeira de Souza
 
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMSSistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMSAdriano Teixeira de Souza
 
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)Adriano Teixeira de Souza
 
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em JavaParadigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em JavaAdriano Teixeira de Souza
 
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...Adriano Teixeira de Souza
 
Ferramentas para desenvolvimento web com produtividade - Slide Artigo (2009)
Ferramentas para desenvolvimento web com produtividade -  Slide Artigo (2009)Ferramentas para desenvolvimento web com produtividade -  Slide Artigo (2009)
Ferramentas para desenvolvimento web com produtividade - Slide Artigo (2009)Adriano Teixeira de Souza
 
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks Adriano Teixeira de Souza
 
Paradigmas de Linguagens de Programação - Modularização, componentização e re...
Paradigmas de Linguagens de Programação - Modularização, componentização e re...Paradigmas de Linguagens de Programação - Modularização, componentização e re...
Paradigmas de Linguagens de Programação - Modularização, componentização e re...Adriano Teixeira de Souza
 

Mais de Adriano Teixeira de Souza (20)

Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...
Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...
Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...
 
Estrutura de dados em Java - Árvores Binárias
Estrutura de dados em Java - Árvores BináriasEstrutura de dados em Java - Árvores Binárias
Estrutura de dados em Java - Árvores Binárias
 
Estrutura de dados em Java - Pilhas
Estrutura de dados em Java - PilhasEstrutura de dados em Java - Pilhas
Estrutura de dados em Java - Pilhas
 
Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada
 
Estrutura de dados em Java - Filas
Estrutura de dados em Java - FilasEstrutura de dados em Java - Filas
Estrutura de dados em Java - Filas
 
Estrutura de dados em Java - Recursividade
Estrutura de dados em Java - RecursividadeEstrutura de dados em Java - Recursividade
Estrutura de dados em Java - Recursividade
 
Estrutura de dados em Java - Filas
Estrutura de dados em Java - Filas Estrutura de dados em Java - Filas
Estrutura de dados em Java - Filas
 
Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)
 
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
 
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)
 
Estrutura de Dados em Java (Revisão de Algoritimos em Java)
Estrutura de Dados em Java (Revisão de Algoritimos em Java)Estrutura de Dados em Java (Revisão de Algoritimos em Java)
Estrutura de Dados em Java (Revisão de Algoritimos em Java)
 
Estrutura de Dados em Java (Introdução)
Estrutura de Dados em Java (Introdução)Estrutura de Dados em Java (Introdução)
Estrutura de Dados em Java (Introdução)
 
Responsive web design
Responsive web designResponsive web design
Responsive web design
 
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMSSistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
 
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
 
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em JavaParadigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
 
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...
 
Ferramentas para desenvolvimento web com produtividade - Slide Artigo (2009)
Ferramentas para desenvolvimento web com produtividade -  Slide Artigo (2009)Ferramentas para desenvolvimento web com produtividade -  Slide Artigo (2009)
Ferramentas para desenvolvimento web com produtividade - Slide Artigo (2009)
 
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
 
Paradigmas de Linguagens de Programação - Modularização, componentização e re...
Paradigmas de Linguagens de Programação - Modularização, componentização e re...Paradigmas de Linguagens de Programação - Modularização, componentização e re...
Paradigmas de Linguagens de Programação - Modularização, componentização e re...
 

Estrutura de Dados - Alocação dinâmica de memória

  • 2. A memória de qualquer computador é uma seqüência de bytes.  Cada byte pode armazenar um número inteiro entre 0 e 255.  Cada byte na memória é identificado por um endereço numérico, independente do seu conteúdo.
  • 3. Conteúdo Endereço 0000 0001 0x0022FF16 0001 1001 0x0022FF17 0101 1010 0x0022FF18 1111 0101 0x0022FF19 1011 0011 0x0022FF1A
  • 4. Cada objeto (variáveis, strings, vetores, etc.) que reside na memória do computador ocupa um certo número de bytes: ◦ Inteiros: 4 bytes consecutivos ◦ Caracteres: 1 byte ◦ Ponto-flutuante: 4 bytes consecutivos  Cada objeto tem um endereço.  Na arquitetura IA-32 (Intel), o endereço é do byte menos significativo do objeto.
  • 5. Variável Endereço Valor 0001 1001 0x0022FF24 char string1[4] 0101 1010 1111 0101 1011 0011 0000 0001 0x0022FF14 0001 1001 0101 1010 1111 0101 1011 0011 0000 0001 0001 1001 float real[4] 0101 1010 1111 0101 1011 0011 0000 0001 0001 1001 0101 1010 1111 0101 1011 0011 0000 0001 0001 1001 0x0022FF10 char string[4] 0101 1010 1111 0101 1011 0011
  • 6. int x = 100;  Ao declararmos uma variável x como acima, temos associados a ela os seguintes elementos: ◦ Um nome (x) ◦ Um endereço de memória ou referência (0xbfd267c4) ◦ Um valor (100)  Para acessarmos o endereço de uma variável, utilizamos o operador &
  • 7. Um ponteiro (apontador ou pointer) é um tipo especial de variável cujo valor é um endereço.  Um ponteiro pode ter o valor especial NULL, quando não contém nenhum endereço.  NULL é uma constante definida na biblioteca stdlib.h.
  • 8. *var  A expressão acima representa o conteúdo do endereço de memória guardado na variável var  Ou seja, var não guarda um valor, mas sim um endereço de memória.
  • 9. *var  O símbolo * acima é conhecido como operador de indireção.  A operação acima é conhecida como desreferenciamento do ponteiro var.
  • 10. int x; int *ap; // apontador para inteiros ap = &x; // ap aponta para x 0000 0000 (00) 0x0022FF14 ap 0010 0010 (22) 1111 1111 (FF) 0001 0000 (10) 0000 0001 0x0022FF10 x 0001 1001 0101 1010 1111 0101
  • 11. Há vários tipos de ponteiros: ◦ ponteiros para caracteres ◦ ponteiros para inteiros ◦ ponteiros para ponteiros para inteiros ◦ ponteiros para vetores ◦ ponteiros para estruturas  O compilador C faz questão de saber de que tipo de ponteiro você está definindo.
  • 12. int *ap_int; // apontador para int char *ap_char; // apontador para char float *ap_float; // apontador para float double *ap_double; // apontador para double // apontador para apontador int **ap_ap_int;
  • 13. Um conjunto limitado de operação aritméticas pode ser executado.  Os ponteiros são endereços de memória. Assim, ao somar 1 a um ponteiro, você estará indo para o próximo endereço de memória do tipo de dado especificado.
  • 14. int *ap; 00 00 00 22 22 22 FF FF FF 18 14 10 ap ap+1 ap+2
  • 15. Sempre que somar ou subtrair ponteiros, deve-se trabalhar com o tamanho do tipo de dado utilizado.  Para isso você pode usar o operador sizeof().
  • 16. O nome de uma matriz é, na verdade, um ponteiro para o primeiro elemento da matriz (endereço base)  Assim, temos duas formas de indexar os elementos de uma matriz ou vetor: ◦ Usando o operador de indexação (v[4]) ◦ Usando aritmética de endereços (*(ap_v + 4))
  • 17. Ponteiros podem ser organizados em matrizes como qualquer outro tipo de dado.  Nesse caso, basta observar que o operador * tem precedência menor que o operador de indexação []. int *vet_ap[5]; char *vet_cadeias[5];
  • 18. Normalmente, são utilizadas como ponteiros para strings, pois uma string é essencialmente um ponteiro para o seu primeiro caractere. void systax_error(int num) { char *erro[] = { "Arquivo nao pode ser aberton", "Erro de leituran", "Erro de escritan", "Falha de midian"}; printf("%s", erro[num]); }
  • 19. Um ponteiro para uma função contém o endereço da função na memória.  Da mesma forma que um nome de matriz, um nome de função é o endereço na memória do começo do código que executa a tarefa da função.  O uso mais comum de ponteiros para funções é permitir que uma função possa ser passada como parâmetro para uma outra função.
  • 20. Ponteiros de função podem ser: ◦ atribuídos a outros ponteiros, ◦ passados como argumentos, ◦ retornados por funções, e ◦ armazenados em matrizes.
  • 21. Funções que devolvem ponteiros funcionam da mesma forma que os outros tipos de funções  Alguns detalhes devem ser observados: ◦ Ponteiros não são variáveis ◦ Quando incrementados, eles apontam para o próximo endereço do tipo apontado ◦ Por causa disso, o compilador deve saber o tipo apontado por cada ponteiro declarado ◦ Portanto, uma função que retorna ponteiro deve declarar explicitamente qual tipo de ponteiro está retornando
  • 22. <tipo> *funcao(.....) { .... return (ponteiro); } <tipo> não pode ser void, pois: • Função deve devolver algum valor • Ponteiro deve apontar para algum tipo de dado
  • 23. Um programa, ao ser executado, divide a memória do computador em quatro áreas: ◦ Instruções – armazena o código C compilado e montado em linguagem de máquina. ◦ Pilha – nela são criadas as variáveis locais. ◦ Memória estática – onde são criadas as variáveis globais e locais estáticas. ◦ Heap – destinado a armazenar dados alocados dinamicamente.
  • 24. Instruções Dados estáticos Embora seu tamanho seja desconhecido, o heap geralmente Dados dinâmicos contém uma quantidade (Heap) razoavelmente grande de memória livre. Pilha
  • 25. As variáveis da pilha e da memória estática precisam ter tamanho conhecido antes do programa ser compilado.  A alocação dinâmica de memória permite reservar espaços de memória de tamanho arbitrário e acessá-los através de apontadores.  Desta forma, podemos escrever programas mais flexíveis, pois nem todos os tamanhos devem ser definidos aos escrever o programa.
  • 26. A alocação e liberação desses espaços de memória é feito por duas funções da biblioteca stdlib.h: ◦ malloc(): aloca um espaço de memória. ◦ free(): libera um espaço de memória.
  • 27. Abreviatura de memory allocation  Aloca um bloco de bytes consecutivos na memória e devolve o endereço desse bloco.  Retorna um ponteiro do tipo void.  Deve-se utilizar um cast (modelador) para transformar o ponteiro devolvido para um ponteiro do tipo desejado.
  • 28. Exemplo: Alocando um vetor de n elementos do tipo inteiro. int *p; p = (int*) malloc(n * sizeof(int));
  • 29. A memória não é infinita. Se a memória do computador já estiver toda ocupada, a função malloc não consegue alocar mais espaço e devolve NULL.  Usar um ponteiro nulo travará o seu computador na maioria dos casos.
  • 30. Convém verificar essa possibilidade antes de prosseguir. ptr = (int*) malloc (1000*sizeof(int)); if (ptr == NULL) { printf ("Sem memorian"); } ...
  • 31. Libera o uso de um bloco de memória, permitindo que este espaço seja reaproveitado.  O mesmo endereço retornado por uma chamada da função malloc() deve ser passado para a função free().  A determinação do tamanho do bloco a ser liberado é feita automaticamente.
  • 32. Exemplo: liberando espaço ocupado por um vetor de 100 inteiros int *p; p = (int*) malloc(100 * sizeof(int)); free(p);
  • 33. Essa função faz um bloco já alocado crescer ou diminuir, preservando o conteúdo já existente: (tipo*) realloc(tipo *apontador, int novo_tamanho) int *x, i; x = (int *) malloc(4000*sizeof(int)); for(i=0;i<4000;i++) x[i] = rand()%100; x = (int *) realloc(x, 8000*sizeof(int)); x = (int *) realloc(x, 2000*sizeof(int)); free(x);
  • 34. int *x, i; x = (int *) malloc(4000*sizeof(int)); x for(i=0;i<4000;i++) x[i] = rand()%100; x x = (int *) realloc(x, x 8000*sizeof(int)); x = (int *) realloc(x, x 2000*sizeof(int)); free(x); x
  • 35. #include<stdio.h> typedef struct { int dia, mes, ano; } data; int main (void) { printf ("sizeof (data) = %dn", sizeof (data)); printf ("sizeof (data *) = %dn", sizeof (data *)); return 0; } Prof. Adriano Teixeira de Souza
  • 37. Analisando o programa mostrado vemos que não se sabe a quantidade de valores que a pessoa vai inserir no vetor por esse motivo declaramos um vetor muito grande.  O problema está se a pessoa, por exemplo, deseja colocar apenas 3 elementos no vetor.  Como o vetor foi declarado com o tamanho igual a 100, o que acontece é o desperdício de memória e caso passe de 100 haverá um estouro.  Portanto a melhor solução seria utilizar alocação dinâmica, ou seja, toda vez que não se sabe ao certo a quantidade de elementos a serem utilizados deve-se utilizar a alocação dinâmica. Prof. Adriano Teixeira de Souza