Estruturas Dinâmicas - Ponteiros Parte I

Documentos relacionados
Estruturas Dinâmicas - Ponteiros

Estruturas dinâmicas Ponteiros

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

Parte I. Introdução à Ciência da Computação I Modularização de Programas. SSC ICC1 Teórica

Funções em Linguagem C Parte II

Estrutura de Programas e Tipos de Dados Simples

Registros/Estruturas e Conjuntos

Comandos de Repetição Parte II

Estrutura de Programas Repetição Parte III

Comandos de Decisão Parte I

Tipos de Dados Simples (Continuação)

Estruturas Dinâmicas - Ponteiros Parte IV

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

3. Linguagem de Programação C

Tipos de Dados Avançados Vetores e Matrizes

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

Aula 24 Ponteiros, vetores e structs

ponteiros INF Programação I Prof. Roberto Azevedo

Estruturas Dinâmicas - Ponteiros Parte IV

Programação Estruturada

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

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

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

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

Alocação Dinâmica em C

TÉCNICAS DE LINGUAGEM DE PROGRAMAÇÃO

Laboratório de Introdução à Ciência da Computação I

Introdução à Computação MAC0110

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.

Laboratório de Introdução à Ciência da Computação I

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

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

Ponteiros e Alocação de Memória

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

Introdução a Programação. Ponteiros e Passagem de Argumentos por Referência

Princípios de Desenvolvimento de Algoritmos MAC122

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

Linguagem C: Ponteiros. Prof. Tiago Alves de Oliveira

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

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

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

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

Linguagem C: Ponteiros. Prof. Leonardo Barreto Campos 1

Computação 2. Aula 5. Profª. Fabiany defines vetor, strings e matriz por parâmetros de função

Algoritmos e Estruturas de Dados I (AEDI) Introdução - AEDI. Prof. Paulo Henrique Pisani

Estrutura do programa

Programação Estruturada

Ponteiros. Baseado nos slides do Prof. Mauro.

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

Introdução à Computação

Linguagem C ponteiros

Linguagem C Ponteiros

Laboratório de Introdução à Ciência da Computação I Aula de Vetores e Matrizes

Fundamentos de Programação

Computação 2. Aula 2. Profª. Fabiany Vetores e Matrizes

Princípios de Desenvolvimento de Algoritmos MAC122

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

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

Programação 11543: Engenharia Informática 6619: Tecnologias e Sistemas de Informação. Cap. 8 Endereçamento de Memória Endereçamento de Memória

Linguagem C: Introdução

Programação de Computadores II. Cap. 5 Vetores

Algoritmos e Introdução à Programação. Lógica e Linguagem de Programação

Aula 1 Apresentação do Curso

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

Ponteiros. Introdução

Faculdade de Computação

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

Arranjos: parâmetros, matrizes.

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

Linguagem C Princípios Básicos (parte 1)

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

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Aula 06 Introdução à Programação Matrizes

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

Variáveis e Operadores em C

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

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

Programação Orientada a Objetos para Redes de Computadores

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

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

Tipos de Dados, Variáveis e Entrada e Saída em C. DCC 120 Laboratório de Programação

Ponteiros de Variáveis

LINGUAGEM C: PONTEIROS

Programação: Vetores

Linguagem C vetores. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

Programação Orientada a Objetos para Redes de Computadores. Arrays. Arrays

Instituto Federal de Educação, Ciência e Tecnologia do RN Câmpus Currais Novos. LINGUAGEM C++ VARIÁVEIS COMPOSTAS Arrays Aula I

Linguagem C: funções e ponteiros. Prof. Críston Algoritmos e Programação

Introdução à Computação

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

Introdução. Ponteiros

ESTRUTURA DE DADOS (TCC )

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

DAS5102 Fundamentos da Estrutura da Informação

Arranjos. David Déharbe

Aula 25: Alocação Dinâmica

Transcrição:

SSC0101 - ICC1 Teórica Introdução à Ciência da Computação I Estruturas Dinâmicas - Ponteiros Parte I Prof. Vanderlei Bonato: vbonato@icmc.usp.br Prof. Claudio Fabiano Motta Toledo: claudio@icmc.usp.br

Sumário Ponteiros Ponteiros e Vetores Aritmética de Ponteiros 18/5/2011 2

Ponteiros Uma variável é armazenada em um certo número de bytes em uma determinada posição de memória. Um ponteiro é uma variável que contém o endereço de outra variável. Ponteiros são usados para acessar e manipular conteúdos em determinado endereço de memória. 18/5/2011 3

Ponteiros Acesso ao endereço de memória da variável: &<nome_var> Declaração de um ponteiro: <tipo> *<nome_var_ponteiro> Exemplos de declaração de ponteiros: int *p; char *q; float *r,*s; 18/5/2011 4

Ponteiros Exemplo de atribuição de variáveis e ponteiros: p = 0; p = NULL; p = &i; p = (int *) 1776; O operador unário & fornece o endereço da variável. Logo p = & i atribui o endereço de i à variável p p aponta para c. 18/5/2011 5

Ponteiros O operador & só se aplica a objetos na memória: variáveis e elementos de vetor Ele não pode ser aplicado a expressões constantes ou variáveis da classe registrador São expressões inválidas &3 &(k+99) Register v; &v 18/5/2011 6

Ponteiros O operador unário * representa indireção ou deferenciação. Se p é um ponteiro, então *p é o valor da variável da qual p é o endereço. O valor direto de p é o endereço de memória. *p é o valor indireto de p, pois representa o valor armazenado no endereço de memória. 18/5/2011 7

Ponteiros int a=1, b=2, *p; a b p 1 2 p=&a a b p 1 2 b = *p; b=a; a b p 1 18/5/2011 8

Exemplo: #include <stdio.h> #include <stdlib.h> int main() { } Ponteiros int i=7, *p = &i; printf("%s%d\n%s%p\n", " Valor de i: ", *p, return 0; "Endereco de i:", p); Valor de i: 7 Endereco de i: 0028FF18 18/5/2011 9

Ponteiros Declaração e inicialização int i=3, j = 5, *p = &i, *q=&j, *r; double x; Expressão Expressão Equivalente Valor p == & i p == (&i) 1 * * & p * ( * (& p) ) 3 r = & x r = (& x) /* ilegal*/ 7 * * p / * q + 7 ( ( (7 * (* p) ) ) / (* q) ) +7 11 * ( r = & j) *= * p (* (r = (& j) ) ) *= (* p) 15 Cuidado: (7 * * p / * q + 7) (7 * * p / * q + 7) 18/5/2011 10

Ponteiros Considere para *p: &p Memória End Conteúdo... p 10 20 * * & p &p -> 10 *&p -> 20 **&p -> 3 *&p -> p... 20 3 *p 18/5/2011 11

Ponteiros Uma declaração void * <nome_ptr> cria um ponteiro do tipo genérico. Conversões durante atribuição entre ponteiros diferentes normalmente eram permitidas no C tradicional. Porém, conversões de tipo envolvendo ponteiro não são permitidas no padrão ANSI C. No ANSIC, a conversão ocorre apenas se um dos tipos é um ponteiro void ou o lado direito é uma constante 0. 18/5/2011 12

Ponteiros Declaração int *p; float *q; void *v; Permitido Não permitido p=0; p = 1; p = (int *) 1; v = 1; v = q; v = p; p = q; p = (int *) q; 18/5/2011 13

Ponteiros e Vetores Um ponteiro pode acessar diferentes endereços. Uma determinada posição em um vetor é um endereço ou um ponteiro que está fixo. Considere o vetor a[ ], onde a aponta para a posição i=0. Temos que: a[ i ] *(a + i) Considere o ponteiro p, também temos que: p[ i ] *(p + i) 18/5/2011 14

Ponteiros ponteiro : int *pt (pt++) num[0] 40 100 int num[3] (pt++) num[1] 60 102 (pt++) num[2] 80 104 endereços ponteiro : char *pt char caract[3] (pt++) caract[0] A 100 (pt++) caract[1] $ 101 endereços (pt++) caract[2] * 102

Ponteiros e Vetores Incremento/decremento de ponteiros int vet[100], *p_vet; p_vet = vet; p_vet++; // aponta para o próximo elemento do vetor p_vet--; // aponta para o elemento anterior do vetor p_vet += 4; //aponta para a posição atual do vetor + 4; OBS: incr. ou decr. qndo vier após o operando é realizado somente após a execução da instrução ter sido completada (o novo valor está disponível somente na próxima instrução), não interessando se há ou não parênteses! 18/5/2011 16

Ponteiros e Vetores int vet[] = {10,11,12,13}, *p_vet, cnt; p_vet = vet; for(cnt=0; cnt<3; cnt++){ printf("\n %d", *p_vet++); } p_vet = vet; for(cnt=0; cnt<3; cnt++){ printf("\n %d", *++p_vet); } Qual a diferença do resultado impresso pelos dois printf? 18/5/2011 17

Ponteiros e Vetores Considere as declarações abaixo: # define N 100 int a[n], i, *p, sum=0; Temos que: p = a p=&a[0]; p = a+1 p=&a[1]; Suponha que o vetor a[n] tenha sido inicializado. As rotinas abaixo são equivalentes p=a; for (p=a; p < &a[n]; ++p) for (i=0; i < N; ++i) for (i=0; i < N; ++i) sum += *p; sum += *(a+i); sum += p[ i ]; 18/5/2011 18

Ponteiros e Vetores No exemplo anterior, o vetor a[n] tem o identificador a como um ponteiro constante. Logo, as expressões abaixo são ilegais: a = p ++a a+=2 &a Não é possível mudar o valor de a. 18/5/2011 19

Ponteiros e Vetores Podemos passar parte de um vetor para uma função, passando um apontador para o início do subvetor. func(&a[4]) func(a+4) A declaração dentro da função func() pode ser: func(int vet[ ]){...} ou func(int *vet) {...} Desde que os limites do vetor sejam obedecidos, pode-se utilizar indexação invertida. vet[-1], vet[-2], vet[-3],... 18/5/2011 20

Aritmética de Ponteiros pt ± a : pt referencia posições de memória depois (+a) ou antes (-a) da posição atual. O valor a é inteiro. Ex: pt+10 ou pt-10 NÃO é permitido operar dessa forma com a sendo um float ou double. Outras operações aritméticas NÃO permitidas: pt1+pt2, pt1*pt2, pt1/pt2

Aritmética de Ponteiros Operações aritméticas permitidas: pt++, pt--; pt1-pt2 (produz um inteiro). Também é possível fazer comparações : pt1>pt2, pt1>=pt2, pt1<pt2, pt1<=pt2, pt1==pt2 Essas operações comparam pela posição de memória. Assim pt1 tem posição mais alta de memória que pt2, se pt1>pt2. 18/5/2011 22

Exemplo: #include <stdio.h> #include <stdlib.h> int main() { } double a[2], *p, *q; p=a; q=p+1; Aritmética de Ponteiros /* aponta para a[0]*/ /* aponta para a[1], ou seja, q=&a[1]*/ printf("%d\n", q-p); /* exibe valor 1 */ printf("%d\n", (int) q - (int) p); /* exibe valor 8 */ return 0; 18/5/2011 23

Exercício I Escreva um programa que: Inicie uma matriz 20x20 com valores aleatórios no intervalo [10,-10]. Determine o maior e o menor valor dessa matriz. Determine a quantidade de valores negativos dessa matriz. Funções devem ser utilizada para cada tarefa. Ponteiros devem ser utilizados sempre que possível. 18/5/2011 24

Exercício II Faça um programa que simule uma pilha. O tamanho máximo da pilha é 100 e apenas valores inteiros podem ser armazenados. As seguintes operações devem estar disponíveis: Imprimir Inserir Retirar 18/5/2011 25

Referências Ascencio AFG, Campos EAV. Fundamentos de programação de computadores. São Paulo : Pearson Prentice Hall, 2006. 385 p. Kelley, A.; Pohl, I., A Book on C: programming in C. 4ª Edição. Massachusetts: Pearson, 2010, 726p. Kernighan, B.W.; Ritchie, D.M. C, A Linguagem de Programação: padrão ANSI. 2ª Edição. Rio de Janeiro: Campus, 1989, 290p. 18/5/2011 26

FIM Aula 14