SlideShare ist ein Scribd-Unternehmen logo
1 von 38
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

Lista de exercicios algoritmos com pseudocodigo
Lista de exercicios   algoritmos com pseudocodigoLista de exercicios   algoritmos com pseudocodigo
Lista de exercicios algoritmos com pseudocodigoMauro Pereira
 
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
 
Introducao banco de dados
Introducao banco de dadosIntroducao banco de dados
Introducao banco de dadosvaniakenob
 
Aula 06 vetores e matrizes
Aula 06   vetores e matrizesAula 06   vetores e matrizes
Aula 06 vetores e matrizesTácito Graça
 
Interfaces Gráficas em Java Parte 1
Interfaces Gráficas em Java Parte 1Interfaces Gráficas em Java Parte 1
Interfaces Gráficas em Java Parte 1Elaine Cecília Gatto
 
A evolução dos processadores
A evolução dos processadoresA evolução dos processadores
A evolução dos processadoresdrogapraisso
 
Introdução à Arquitetura de Computadores
Introdução à Arquitetura de ComputadoresIntrodução à Arquitetura de Computadores
Introdução à Arquitetura de ComputadoresMauro Pereira
 
Módulo 12 - Introdução aos sistemas de informação
Módulo 12 - Introdução aos sistemas de informaçãoMódulo 12 - Introdução aos sistemas de informação
Módulo 12 - Introdução aos sistemas de informaçãoLuis Ferreira
 
Estrutura de Dados - Aula 12 - Pesquisa de Dados (Sequencial e Binária)
Estrutura de Dados - Aula 12 - Pesquisa de Dados (Sequencial e Binária)Estrutura de Dados - Aula 12 - Pesquisa de Dados (Sequencial e Binária)
Estrutura de Dados - Aula 12 - Pesquisa de Dados (Sequencial e Binária)Leinylson Fontinele
 
Banco de Dados I - Aula 03 - Conceitos de Sistemas de Banco de Dados
Banco de Dados I - Aula 03 - Conceitos de Sistemas de Banco de DadosBanco de Dados I - Aula 03 - Conceitos de Sistemas de Banco de Dados
Banco de Dados I - Aula 03 - Conceitos de Sistemas de Banco de DadosLeinylson Fontinele
 
Aula 01 - Fundamentos de Banco de Dados (2).pdf
Aula 01 - Fundamentos de Banco de Dados (2).pdfAula 01 - Fundamentos de Banco de Dados (2).pdf
Aula 01 - Fundamentos de Banco de Dados (2).pdfMarcelo Silva
 
Estrutura de Dados - Aula 09 - Listas Simplesmente Encadeadas
Estrutura de Dados - Aula 09 - Listas Simplesmente EncadeadasEstrutura de Dados - Aula 09 - Listas Simplesmente Encadeadas
Estrutura de Dados - Aula 09 - Listas Simplesmente EncadeadasLeinylson Fontinele
 
Estrutura de Dados - Aula 12 - Listas Duplamente Encadeadas
Estrutura de Dados  - Aula 12 - Listas Duplamente EncadeadasEstrutura de Dados  - Aula 12 - Listas Duplamente Encadeadas
Estrutura de Dados - Aula 12 - Listas Duplamente EncadeadasLeinylson Fontinele
 
Estrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentaisEstrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentaisFabrício Lopes Sanchez
 
Conceitos de Banco de dados e SGBD
Conceitos de Banco de dados e SGBDConceitos de Banco de dados e SGBD
Conceitos de Banco de dados e SGBDVinicius Buffolo
 

Was ist angesagt? (20)

Lista de exercicios algoritmos com pseudocodigo
Lista de exercicios   algoritmos com pseudocodigoLista de exercicios   algoritmos com pseudocodigo
Lista de exercicios algoritmos com pseudocodigo
 
Estrutura de Dados - Ponteiros
Estrutura de Dados - PonteirosEstrutura de Dados - Ponteiros
Estrutura de Dados - Ponteiros
 
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
 
Introducao banco de dados
Introducao banco de dadosIntroducao banco de dados
Introducao banco de dados
 
Aula 06 vetores e matrizes
Aula 06   vetores e matrizesAula 06   vetores e matrizes
Aula 06 vetores e matrizes
 
Interfaces Gráficas em Java Parte 1
Interfaces Gráficas em Java Parte 1Interfaces Gráficas em Java Parte 1
Interfaces Gráficas em Java Parte 1
 
A evolução dos processadores
A evolução dos processadoresA evolução dos processadores
A evolução dos processadores
 
Introdução à Arquitetura de Computadores
Introdução à Arquitetura de ComputadoresIntrodução à Arquitetura de Computadores
Introdução à Arquitetura de Computadores
 
Algoritmos: Variáveis e Constantes
Algoritmos: Variáveis e ConstantesAlgoritmos: Variáveis e Constantes
Algoritmos: Variáveis e Constantes
 
Módulo 12 - Introdução aos sistemas de informação
Módulo 12 - Introdução aos sistemas de informaçãoMódulo 12 - Introdução aos sistemas de informação
Módulo 12 - Introdução aos sistemas de informação
 
Estrutura de Dados - Aula 12 - Pesquisa de Dados (Sequencial e Binária)
Estrutura de Dados - Aula 12 - Pesquisa de Dados (Sequencial e Binária)Estrutura de Dados - Aula 12 - Pesquisa de Dados (Sequencial e Binária)
Estrutura de Dados - Aula 12 - Pesquisa de Dados (Sequencial e Binária)
 
Banco de Dados I - Aula 03 - Conceitos de Sistemas de Banco de Dados
Banco de Dados I - Aula 03 - Conceitos de Sistemas de Banco de DadosBanco de Dados I - Aula 03 - Conceitos de Sistemas de Banco de Dados
Banco de Dados I - Aula 03 - Conceitos de Sistemas de Banco de Dados
 
Linguagem C - Vetores
Linguagem C - VetoresLinguagem C - Vetores
Linguagem C - Vetores
 
Aula 01 - Fundamentos de Banco de Dados (2).pdf
Aula 01 - Fundamentos de Banco de Dados (2).pdfAula 01 - Fundamentos de Banco de Dados (2).pdf
Aula 01 - Fundamentos de Banco de Dados (2).pdf
 
Modelo E-R
Modelo E-RModelo E-R
Modelo E-R
 
Estrutura de Dados - Aula 09 - Listas Simplesmente Encadeadas
Estrutura de Dados - Aula 09 - Listas Simplesmente EncadeadasEstrutura de Dados - Aula 09 - Listas Simplesmente Encadeadas
Estrutura de Dados - Aula 09 - Listas Simplesmente Encadeadas
 
Aula 5 banco de dados
Aula 5   banco de dadosAula 5   banco de dados
Aula 5 banco de dados
 
Estrutura de Dados - Aula 12 - Listas Duplamente Encadeadas
Estrutura de Dados  - Aula 12 - Listas Duplamente EncadeadasEstrutura de Dados  - Aula 12 - Listas Duplamente Encadeadas
Estrutura de Dados - Aula 12 - Listas Duplamente Encadeadas
 
Estrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentaisEstrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentais
 
Conceitos de Banco de dados e SGBD
Conceitos de Banco de dados e SGBDConceitos de Banco de dados e SGBD
Conceitos de Banco de dados e SGBD
 

Andere mochten auch

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
 
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
 

Andere mochten auch (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
 
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 - Listas Encadeadas
Estrutura de Dados - Listas EncadeadasEstrutura de Dados - Listas Encadeadas
Estrutura de Dados - Listas Encadeadas
 
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
 

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

Ähnlich wie 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
 
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
 
Henriquecristovao manual c-cpp
Henriquecristovao manual c-cppHenriquecristovao manual c-cpp
Henriquecristovao manual c-cpp
 

Mehr von 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
 

Mehr von 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
 
Estrutura de dados - Árvores Binárias
Estrutura de dados - Árvores BináriasEstrutura de dados - Árvores Binárias
Estrutura de dados - Árvores Binárias
 
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
 

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