Ponteiros e Alocação Dinâmica em C. Fonte: DCC UFMT (modificado)

Documentos relacionados
ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Declarando e Utilizando Ponteiros. Para declarar um ponteiro temos a seguinte forma geral: tipo_do_ponteiro *nome_da_variável;

É o asterisco (*) que faz o compilador saber que aquela variável não vai guardar um valor e sim um endereço para aquele tipo especificado.

Ponteiros - Parte I. Ponteiros, Ponteiros e Vetores, Algoritmo Bubble Sort, Alocação Dinâmica de Memória

19 - Ponteiros em C Parte 1

Curso de Programação C em Ambientes Linux Aula 04

Vetores e Strings. 6. Comandos de entrada e saída formatada que trabalham sobre strings

Ponteiros, ponteiros e vetores e alocação dinâmica de memória

Aula 17: Ponteiros e Alocação Dinâmica em C

SSC304 Introdução à Programação Para Engenharias. Ponteiros. GE4 Bio

Estruturas dinâmicas Ponteiros

Ponteiros. Baseado nos slides do Prof. Mauro.

Estruturas Dinâmicas - Ponteiros

INF 1007 Programação II

Instituto Federal da Bahia Análise e Desenvolvimento de Sistemas INF029 Laboratório de Programação Aula 03: Ponteiros

Ponteiros e Alocação Dinâmica. Prof. Péricles Miranda

Alocação e Gerência de Memória: APONTADORES

Reinaldo Gomes Alocação Dinâmica

Programação Computacional Aula 16: Alocação Dinâmica de Memória

Alocação Dinâmica de Memória. Programação II

Ponteiro. Ponteiro. Objetivo. Compreender a definição e dominar a implementação de ponteiros em C.

AULA 6. Conceitos. Melhores momentos. Conceitos. Conceitos. Conceitos. Conceitos

Módulo 5 Vetores e Alocação Dinâmica

Aula 25: Alocação Dinâmica

Ponteiros e alocação dinâmica de memória. Disciplina de Programação de Computadores I Universidade Federal de Ouro Preto

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

Princípios de Desenvolvimento de Algoritmos MAC122

Computação 2. Aula 7. Profª. Fabiany Ponteiros

MC-102 Aula 19 Ponteiros II

Centro Universitário Franciscano Curso de Sistemas de Informação Disciplina de algoritmos e programação II. Ponteiros

Introdução à Ciência da Computação I. Alocação Dinâmica. Prof. Claudio Fabiano Motta Toledo

Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores

Linguagem C. Ponteiros. Alex Vidigal Bastos.

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Ponteiros. Embora o programador não tenha acesso ao endereço de uma variável, existem algumas situações onde é necessário a utilização deste endereço.

1/34 GESTÃO DINÂMICA DE MEMÓRIA

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica

Alocação Dinâmica em C

Ponteiros. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Ponteiros e Tabelas. K&R: Capítulo 5

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

3. Linguagem de Programação C

Programação I Ponteiros e alocação dinâmica de memória. Prof. Carlos Alberto

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória

Estrutura de dados 2. Ponteiro. Prof. Jesuliana N. Ulysses

1 Exercícios com ponteiros

Ponteiros. Considere um carteiro recém-chegado na vila Na vila, a referência para se encontrar a casa é pelo morador

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Programação Imperativa. Lição n.º 16 A pilha de execução

Essencialmente, um ponteiro nada mais é do que uma variável que ao invés de conter um valor, contém um endereço de memória.

Ponteiros e Alocação de Memória

INF1007: Programação 2. 2 Alocação Dinâmica. 17/02/2014 (c) Dept. Informática - PUC-Rio 1

USP-ICMC-BInfo. Ponteiros em C. SCC501 - ICC-II 2011 Prof. João Luís

Programação Estruturada

O que é um apontador em C (type pointer in C)?

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

DAS5102 Fundamentos da Estrutura da Informação

Programação Estruturada Prof. Rodrigo Hausen Ponteiros e Passagem de Parâmetros

Introdução à Computação

Linguagem C Ponteiros

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Ponteiros. prof. Fabrício Olivetti de França

Introdução a Ponteiros e Vetores em C

INF1007: Programação 2. 4 Tipos Estruturados. 10/23/09 (c) Dept. Informática - PUC-Rio 1

1 Exercícios com ponteiros

Estruturas de Dados. Profa. Juliana Pinheiro Campos

Ponteiros. Ponteiros. Ponteiros. Ponteiros. Ponteiros. Introdução a Programação. Profa. Roseli Romero

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

A sintaxe para se declarar uma variável do tipo ponteiro é dada por:

Módulo 8 Tipos Estruturados

Estruturas Dinâmicas - Ponteiros Parte I

Ponteiros em C. Prof. Rui Jorge Tramontin Jr. UDESC - Rui J. Tramontin Jr. 1

Estrutura de Dados. Aula 07 Alocação Dinâmica

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação. Estruturas em C

5. Vetores e alocação dinâmica

Linguagem de Programação C. Ponteiros

Alocação Dinâmica. Introdução à Computação

Alocação Dinâmica de Memória

Modulo 12: alocação dinâmica de memória

Aula 08: Funções (Parte II)

Linguagem C: Ponteiros - Alocação Dinâmica

1. Revisão de Vetores, Ponteiros, Funções e Estruturas em C

Algoritmos e Estruturas de Dados. Prof. Marcelo Zorzan Profa. Melissa Zanatta

Tipos Abstratos de Dados. Estrutura de Dados

BCC202 - Estrutura de Dados I

Ponteiros. Introdução

LINGUAGEM C: ALOCAÇÃO DINÂMICA

Programação de Computadores II. Cap. 5 Alocação Dinâmica

Programação de Computadores II

20 - Ponteiros em C Parte 1

Alocação Dinâmica. Túlio Toffolo BCC202 Aula 02 Algoritmos e Estruturas de Dados I

Transcrição:

Ponteiros e Alocação Dinâmica em C Fonte: DCC UFMT (modificado)

Definições Variáveis : endereçam uma posição de memória que contem um determinado valor dependendo do seu tipo (char, int, float, double,...) void main() { long a=5; char ch= x ;

Definições Ponteiros: são variáveis cujo conteúdo é um endereço de memória. Assim, um ponteiro endereça uma posição de memória que contém valores que são na verdade endereços para outras posições de memória. void main() { long a=5; char ch= c ; long *aprt = &a;

Declaração de Ponteiros Para declararmos um ponteiro, basta utilizar o operador *(asterisco) antes do nome da variável. Exemplo: int *p; Ponteiros são tipados, ou seja, devem ter seu tipo declarado e somente podem apontar para variáveis do mesmo tipo.

Operadores para Ponteiros Para trabalharmos com ponteiros, C disponibiliza os seguintes operadores: & - Fornece o endereço de memória onde está armazenado uma variável. Lêse o endereço de. * - Valor armazenado na variável referenciada por um ponteiro. Lê-se o valor apontado por.

Operadores para Ponteiros #include <conio.h> int main(void) { long a=5; long *aprt = &a; //variavel a armaz. no ponteiro printf("conteudo do ponteiro: %ld\n",*aprt); printf("end. mem. do cont. do ponteiro: %x\n",&aprt); printf("endereco de memoria do ponteiro: %x\n",aprt); getche(); O que será impresso na tela? 5 0x0100 0x0105 OBS: Os endereços de memória podem divergir de micro p micro, visto que a memória RAM é de armazenamento aleatório

Alguns exemplos... (1) #include <conio.h> int main(void) { int num,valor; int *p; num=55; p=&num; /* Pega o endereco de num */ valor=*p; /* Valor é igualado a num de uma maneira indireta */ printf ("%d\n",valor); printf ("Endereco para onde o ponteiro aponta: %p\n",p); printf ("Valor (Valor da variavel apontada: %d\n",*p); getch();

Alguns exemplos... (2) #include <conio.h> int main(void) { int num,*p; num=55; p=&num; /* Pega o endereco de num */ printf("valor inicial: %d\n",num); printf("endereco de memoria do ponteiro: %p",p); *p=100; /* Muda o valor de num de uma maneira indireta */ printf ("\nvalor final: %d\n",num); //note que num foi alterado,mesmo nao sendo referenciado diretamente printf("endereco de memoria do ponteiro: %p",p); getch();

Alguns exemplos... (3) #include <conio.h> int main(void){ int num,*p1, *p2; num=55; p1=&num; /* Pega o endereco de num */ p2=p1; /*p2 passa a apontar para o mesmo endereço apontado por p1 */ printf("endereco de p1: %p\n",p1);; printf("valor apontado por p1: %d\n",*p1); printf("endereco de p2: %p\n",p2); printf("valor apontado por p2: %d\n",*p2); getch();

Operadores para Ponteiros Incremento/Decre mento: Apontar para o próximo valor do mesmo tipo para o qual o ponteiro aponta: #include <conio.h> int main(void){ int a,b,*aptr; a=5; b=6; aptr=&a; printf("endereco do apontador: %p\n",aptr);; printf("valor apontado pelo apontador: %d\n",*aptr); aptr++; aptr=&b; printf("endereco do apontador: %p\n",aptr);; printf("valor apontado pelo apontador: %d\n",*aptr); getch();

Vetores como ponteiros O C enxerga vetores como ponteiros Quando declaramos um vetor, o C aloca memória para todas as posições necessárias conforme seu tipo: int vet[10]; O nome do vetor pode ser atribuído a um ponteiro. Neste caso o ponteiro irá endereçar a posição 0 do vetor: int *p; p=vet; ou int *p; p=&vet[0];

Alguns exemplos... (4) #include <conio.h> int main(void){ int vet[4]; int *p; p=vet; //referencia o apontador p à partir da posicao 0 do vetor for (int count=0;count<4;count++) { *p=0; //atribui 0 a posicao atual do apontador p++; //incrementa o endereco do apontador, incrementando automaticamente a posicao do vetor for (int i=0;i<4;i++) printf("%d\t",vet[i]); getch();

Vetores como ponteiros Importante: um ponteiro é uma variável, mas o nome de um vetor não é uma variável Isto significa, que não se consegue alterar o endereço que é apontado pelo "nome do vetor Diz-se que um vetor é um ponteiro constante! Condições inválidas: int vet[10], *p; vet++; vet = p;

Ponteiros como vetores Quando um ponteiro está endereçando um vetor, podemos utilizar a indexação também com os ponteiros: Exemplo: #include <conio.h> i t i ( id){ int main(void){ int vet[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10; int *p; p=vet; printf("o terceiro elemento do vetor e: %d",p[2]); getch(); Neste caso p[2] equivale a *(p+2)

Porque inicializar ponteiros? Observe o código: #include <conio.h> int main(void){ int x,*p; x=13; *p=x; //posição de memória de p é indefinida, podendo subscrever um apontador cujo endereco já esteja sendo utilizado!!! printf("%d",*p); getch(); A não inicialização de ponteiros pode fazer com que ele esteja alocando um espaço de memória utilizado, por exemplo, pelo S.O.

Porque inicializar ponteiros? No caso de vetores, é necessário sempre alocar a memória necessária para compor as posições do vetor. O exemplo abaixo apresenta um programa que compila, porém poderá ocasionar sérios problemas na execução. Como por exemplo utilizar um espaço de memória alocado para outra aplicação.

Alocação dinâmica de memória Durante a execução de um programa é possível alocar uma certa quantidade de memória para conter dados do programa A função malloc (n) aloca dinamicamente n bytes e devolve um ponteiro para o início da memória alocada A função free(p) libera a região de memória apontada por p. O tamanho liberado está implícito, isto é, é igual ao que foi alocado anteriormente por malloc.

Alocação dinâmica de memória A função malloc não tem um tipo específico. Assim, (int *) converte seu valor em ponteiro para inteiro. Como não sabemos necessariamente o comprimento de um inteiro (2 ou 4 bytes dependendod d do compilador), usamos como parâmetro a função sizeof(int). //aloca n elementos para v #include <conio.h> v = (int *) malloc(n*sizeof(int)); #include <stdlib.h> // zera o vetor v com n elementos int main(void){ for (i = 0; i < n; i++){ int *v, i, n; v[i] = i; printf("digite o tamanho do vetor: "); scanf("%d", &n); // le n for (i = 0; i < n; i++){ printf("%d\t",v[i]); free(v);// libera os n elementos de v getch();