Ponteiros em C Prof. Kariston Pereira

Slides:



Advertisements
Apresentações semelhantes
Laboratório de programação III Linguagem C
Advertisements

Marco Antonio Montebello Júnior
Programação II Estruturas de Dados
Programação II Estruturas de Dados
Alocação Dinâmida de Memória
Algoritmos e Estrutura de Dados I
1 Tipos definidos O programador pode definir seus próprios tipos de dados tipos complexos usados da mesma forma que os simples declaram-se variáveis utilizando-se.
Alocação Dinâmica de Memória
LPG - I: Alocação Dinâmica de Memória - Ponteiros
LPG - I: Ponteiros e Vetores/Matrizes UDESC - SBS
Estruturas de Dados I Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
LINGUAGEM C Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo.
Linguagem C Strings.
Ponteiros em Linguagem C
Slides Prof. Jean SIMÃO Revisão: Prof. João FABRO
Fundamentos de Programação 1
Ponteiros.
Escola Secundária c/ 3º CEB da Batalha
Listas Encadeadas.
Revisão da Linguagem C.
APRESENTAÇÃO: GIANCARLO DE GUSMÃO GONÇALVES CURSO DE C AULA 08: Tipos Estruturados.
Prof.° Jean Daniel Henri Merlin Andreazza Estrutura de Dados
Alocação Dinâmica de Memória Professor Mário Dantas
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
Aula prática 8 Ponteiros Monitoria de Introdução à Programação
Aula prática 8 Ponteiros Monitoria de Introdução à Programação.
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
PROGRAMAÇÃO ESTRUTURADA II
Linguagem de Programação II Parte IX
Definição de Tipos Estruturas e Ponteiros
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Alocação Dinâmica de Memória
UNIDADE 5 ESTRUTURAS DE DADOS HOMOGÊNEAS
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Professor Mário Dantas
Prof. Ricardo Santos PONTEIROS
Linguagem C : Ponteiros
Estruturas de Dados Aula 5: Matrizes
Ambiente de Execução - Rotinas
Algoritmos e Estruturas de Dados I – Ponteiros
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Aula P.02 – BCC202 Revisão sobre Ponteiros Túlio Toffolo
1 Alocação Dinâmica Quando se declara arrays o tamanho deve ser fixo e definido primeiramente –Alocação estática Pode-se alocar dinamicamente o espaço.
Estruturas de Dados Aula 7: Tipos Estruturados 23/04/2014.
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Algoritmos e Estruturas de Dados
Joaquim José Hangalo  Podemos entender a memória do computador como um conjunto de células que armazenam informações.  Cada célula.
Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
CES-10 INTRODUÇÃO À COMPUTAÇÃO
Algoritmos e Programação MC102 Prof. Paulo Miranda IC-UNICAMP Aula 15 Ponteiros.
INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 1 Estruturas de Dados - T.332 Capítulo 3 Parte 1: Ponteiros, Passagem.
Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória.
INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica.
Leandro Almeida  As declarações abaixo alocam memória para diversas variáveis.  A alocação é estática, pois acontece antes que o programa.
Linguaguem de Programação II
Estrutura de Dados Revisão Professor Luiz José Hoffmann Filho
Ponteiros. Programação II Professora: Mai-Ly vanessa horário: ter 9h-11h; sex 11h-13h Aula 1.
11 Revisão da Linguagem C Prof. Kariston Pereira Adaptado de Material gentilmente fornecido pelo Prof. Rui Tramontin (DCC/UDESC)
Algoritmo e Estrutura de Dados I Aulas 15 – Linguagem C Alocação Dinâmica de Memória Márcia Marra
Linguagem de Programação
Programação em C Aula 9.
ponteiros Estrutura de Dados Prof. André Cypriano M. Costa
Fundamentos de Programação 1
Aula Prática 6 Ponteiros Monitoria  Quando declaramos uma matriz:  tipo meuArray[tam];  O compilador aloca a matriz em uma região de memória.
Alocação Dinâmica Dilvan Moreira. Objetivos  Entender o que são e como usar:  Gerenciamento de Memória  Alocação Dinâmica em C.
Alocação Dinâmica de Memória e Tipo Abstrato de Dados Cristiano Arbex Valle Vinicius Fernandes dos Santos
Transcrição da apresentação:

Ponteiros em C Prof. Kariston Pereira Adaptado de Material gentilmente fornecido pelo Prof. Rui Tramontin (DCC/UDESC) 1

UDESC – Prof. Kariston Pereira Índice Introdução Operações sobre Ponteiros Exemplos Ponteiros e Funções Alocação Dinâmica em C UDESC – Prof. Kariston Pereira 2

UDESC – Prof. Kariston Pereira Introdução Um ponteiro é uma variável cujo conteúdo é um endereço de memória. Normalmente, de outra variável. Nesse caso, diz-se que o ponteiro aponta para a variável. Devem ser associados e um tipo de dados, e são declarados com um “*” antes do seu identificador: int *ponteiro; UDESC – Prof. Kariston Pereira

Operações sobre Ponteiros Operadores para ponteiros: & - retorna o endereço de uma variável. * - retorna o conteúdo apontado pelo ponteiro. int *ip; int x; ip = &x; *ip = 100; ip x 100 UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira Exemplo int x = 1, y = 2; int *ip; ip = &x; y = *ip; *ip = 3; x 3 1 y 2 1 ip UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira Contra-Exemplo Ponteiros devem sempre ser inicializados. int *ip; *ip = 10; Erro na execução! Ponteiro não inicializado. int *ip; int x; ip = &x; *ip = 10; Ok! UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira Ponteiros e Funções Parâmetros de funções podem ser de dois tipos: Por valor Por referência; Ponteiros são usados na passagem por referência. UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira Ponteiros e Funções Exemplo: Função para troca de valores entre duas variáveis: swap(a, b); void swap(int x, int y) { int temp; temp = x; x = y; y = temp; } Não funciona! Parâmetros são alocados na pilha; Desalocados no final da execução. UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira Ponteiros e Funções Exemplo: Função para troca de valores entre duas variáveis: swap(&a, &b); void swap(int *x, int *y) { int temp; temp = *x; *x = *y; *y = temp; } Funciona! Referências são passadas como parâmetro. A modificação é feita diretamente em a e b. UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira Alocação Dinâmica em C UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira Alocação Dinâmica em C A memória alocada pelas funções de alocação dinâmica é obtida do heap. O heap é a região de memória livre que se encontra entre o programa (com a área de armazenamento permanente) e a pilha (stack). A linguagem C possui duas funções básicas para gerência de memória: malloc(num de bytes) - aloca memória. free(endereço) - libera memória UDESC – Prof. Kariston Pereira

void *malloc(número_de_bytes); Função malloc() Protótipo: void *malloc(número_de_bytes); Devolve um ponteiro do tipo void (sem tipo) para o início (1º byte) da área de memória alocada. Para isto deve ser utilizado sempre um typecasting. x = (int *) malloc( sizeof(int) ); número_de_bytes é a quantidade de bytes alocada. UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira Função free() Protótipo: void free( void *p ); Devolve memória previamente alocada apontada por p. A utilização de free() com um valor de ponteiro qualquer poder ter resultados catastróficos. A gerência de buracos no heap é responsabilidade do sistema operacional. UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira Exemplo StackPointer Topo da pilha #include <stdlib.h> #include <stdio.h> char *a; int *b; main () { a = (char *) malloc(512); // Aloca 512 bytes b = (int *) malloc(50*sizeof(int)); // Aloca espaço // para 50 inteiros. free(a); } HeapPointer Topo da área alocável 50*int = 200 bytes 512 bytes Variáveis estáticas a b 100111010... Código objeto Constantes Sistema Operacional UDESC – Prof. Kariston Pereira

Aritmética de Ponteiros UDESC – Prof. Kariston Pereira

Aritmética de Ponteiros A linguagem C permite que se faça operações aritméticas sobre ponteiros. Oferece uma liberdade que nenhuma outra linguagem de programação oferece (exceto assemblers). Isto é muito útil, porém é também muito perigoso! Operações válidas com ponteiros: adição, subtração e comparação. São muito úteis com vetores. UDESC – Prof. Kariston Pereira

Semântica da Aritmética de Ponteiros A aritmética de ponteiros leva em o tamanho ocupado pelo tipo de dados apontado. Sejam p um ponteiro para o tipo T, e i um valor inteiro. p + i é equivalente a: endereço( p ) + i * sizeof( T ) p - i é equivalente a: endereço( p ) - i * sizeof( T ) UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira Ponteiros e Vetores Vetores podem ser tratados como ponteiros. Aritmética de ponteiros é usada para localizar elementos dentro de um vetor. Dado um vetor A: A[i] ≡ *( A + i ) UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira Ponteiros e Vetores Exemplo: int arr[10]; O tipo int ocupa 4 bytes na memória. Assumindo que arr está no endereço 1000, temos: UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira Exemplos UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira Exemplo 1 int *aponta; int valor1, valor2; valor1 = 5; aponta = &valor1; valor2 = *aponta; printf("%i\n", valor2); UDESC – Prof. Kariston Pereira

Exemplo 2: invertendo um vetor int x[5] = {1, 2, 3, 4, 5}; int *left = x; int *right = x + 4; while(left < right) { int temp = *left; *left = *right; *right = temp; left++; right--; } UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira Exemplo 2 int *p1, *p2, *p3, *p4, x=0; p1 = &x; p2 = p1 + 1; p3 = p2 + 4; p4 = p3 - 5; printf("%i\n", *p1); printf("%i\n", *p2); printf("%i\n", *p3); printf("%i\n", *p4); printf("%i\n", p1); printf("%i\n", p2); printf("%i\n", p3); printf("%i\n", p4); UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira Exemplo 2 int *p1, *p2, *p3, *p4, x=0; p1 = &x; p2 = p1 + 1; p3 = p2 + 4; p4 = p3 - 5; printf("%i\n", *p1); // 0 printf("%i\n", *p2); // “lixo” printf("%i\n", *p3); // “lixo” printf("%i\n", *p4); // 0 printf("%i\n", p1); // 1000 printf("%i\n", p2); // 1004 printf("%i\n", p3); // 1020 printf("%i\n", p4); // 1000 UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira char nome[30] = "João da Silva"; char *p1, *p2; char car; int i; p1 = nome; car = nome[3]; car = p1[0]; p2 = &nome[5]; printf("%s", p2); p2 = p1; p2 = p1 + 5; printf("%s",(p1 + 5)); printf("%s",(p1 + 20)); for (i=0; i < strlen(nome); i++) { printf ("%c", nome[i]); p2 = p1 + i; printf ("%c", *p2); } UDESC – Prof. Kariston Pereira

UDESC – Prof. Kariston Pereira char nome[30] = "João da Silva"; char *p1, *p2; char car; int i; p1 = nome; // nome é ponteiro. Mesmo que p1 = &nome[0]. car = nome[3]; // atribui 'o' a car. car = p1[0]; // atribui 'J' a car. p2 = &nome[5]; // p2 aponta para 6ª posição de nome ('d'). printf("%s", p2); // imprime "da Silva". p2 = p1; // p2 aponta para o mesmo endereço de p1. p2 = p1 + 5; // equivalente a p2 = &nome[5]. printf("%s",(p1 + 5)); // imprime "da Silva". printf("%s",(p1 + 20)); // imprime lixo! (cuidado). for (i=0; i < strlen(nome); i++) { printf ("%c", nome[i]); // imprime 'J','o','ã',... p2 = p1 + i; // p2 aponta para próximo caracter em nome. printf ("%c", *p2); // imprime 'J','o','ã',... } UDESC – Prof. Kariston Pereira