Programação de Computadores I. Ponteiros



Documentos relacionados
Linguagem C Ponteiros

Programação de Computadores I. Linguagem C Vetores

Estruturas de Dados. Alguns dados não costumam ser tão simples assim... Podem ser compostos por vários dados distintos

Prof. Yandre Maldonado - 1 PONTEIROS. Prof. Yandre Maldonado e Gomes da Costa

Operaçõe õ s c om o Strings Intr oduç ão a o Ponte iros o e Funçõe õ s

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

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

IFTO LÓGICA DE PROGRAMAÇÃO AULA 05

Curso de C para Engenharias

INF 1005 Programação I

Capítulo 2: Introdução à Linguagem C

Estrutura de Dados Básica

Semântica de Referência e Vetores / Matrizes

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

system("pause"); //Envia comando para o sistema operacional solicitando parada de execução do programa } //limitador do corpo do programa

Lista de Exercícios da 3ª Unidade. ( Ponteiros, Alocação dinâmica, Arquivos, Estruturas de Dados)

INF 1620 P1-10/04/02 Questão 1 Nome:

Conversão de Tipos e Arrays

Introdução à Programação

Sintaxe Básica de Java Parte 1

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

MC-102 Aula 17 Strings e Matrizes

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Alocação dinâmica de memória

2. OPERADORES ALGORITMOS, FLUXOGRAMAS E PROGRAMAS FUNÇÕES... 10

ALGORITMO I VARIÁVEIS INDEXADAS

Tipos de Dados Avançados Vetores e Matrizes

Primeiro Curso de Programação em C 3 a Edição

17 - Funções e Procedimentos em C Programação Modular

Edwar Saliba Júnior. Dicas, Comandos e Exemplos Comparativos entre Linguagem Algorítmica e Linguagem C / C++

Unidade IV: Ponteiros, Referências e Arrays

Índice. Capítulo 2 Estrutura de Dados sequencial com armazenamento sequencial

Vetores. Vetores. Figura 1 Exemplo de vetor com 10 elementos

CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM

Edwar Saliba Júnior. Dicas, Comandos e Exemplos Comparativos entre Linguagem Algorítmica e Linguagem C

Tipos de Dados Simples

20 Caracteres - Tipo char

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

PIP/CA - Programa Interdisciplinar de Pós-Graduação em Computação Aplicada da UNISINOS ALGORITMOS & ESTRUTURAS DE DADOS

Componentes da linguagem C++

Alocação Dinâmica em C

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Estruturas de Repetição

JSP - ORIENTADO A OBJETOS

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

Sistemas Operacionais e Introdução à Programação. Programação com linguagem C

Linguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador

Algoritmos e Programação _ Departamento de Informática

Linguagem e Técnicas de Programação

Tipos agregados. Tipos estruturados

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

Capítulo 9. Vetores e Matrizes. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

DAS5102 Fundamentos da Estrutura da Informação

INF 1005 Programação I

Internet e Programação Web

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

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

Os objetivos indicados aplicam-se a duas linguagens de programação: C e PHP

Exemplos. char c; int i=67;... c= A ; c=c+1; if (c== B )... c=i; i=c; i++; if (i>= C )...

Variáveis e Comandos de Atribuição

PROGRAMA DE DISCIPLINA

13 Números Reais - Tipo float

Linguagem de Programação C

Curso de Linguagem C

Resumo da Matéria de Linguagem de Programação. Linguagem C

Linguagem e Técnicas de Programação I Operadores, expressões e funções. Prof. MSc. Hugo Souza Material desenvolvido por: Profa.

Fundamentos de Programação de Computadores Linguagem C Vetor Unidade 09 Linguagem C - Vetor 1/16

UNIVERSIDADE FEDERAL DO PARANÁ

PROGRAMA DE DISCIPLINA

Curso: Ciência da Computação Disciplina: Construção de Compiladores Período: Prof. Dr. Raimundo Moura

AULA 2: INTRODUÇÃO A LINGUAGEM DE C. Curso: Ciência da Computação Profª.: Luciana Balieiro Cosme

Trabalho 3: Agenda de Tarefas

Introdução a POO. Introdução a Linguagem C++ e POO

Estrutura de um programa em linguagem C

Apontadores/ponteiros

Roteiro 1: Dados, variáveis, operadores e precedência

INTRODUÇÃO À LINGUAGEM C++

ESTRUTURA CONDICIONAL

Curso de C. Memória Dinâmica 17/05/ :33 1

Algoritmos e Programação Conceitos e Estruturas básicas (Variáveis, constantes, tipos de dados)

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 Classes e instanciação de objectos (em Java)

Universidade da Beira Interior Cursos: Engenharia Informática, Matemática /Informática e Ensino da Informática

Laboratório de Programação. Prof. Oscar Luiz Monteiro de Farias

5 Apresentando a linguagem C

Introdução a C Tipos de Dados Variáveis Operadores

MC-102 Algoritmos e Programação de Computadores IC-UNICAMP. Aula 21 - Registros. Por: Luís Augusto Angelotti Meira (Sala IC-71) 1S2005

P r o g r a m a ç ã o d e C o m p u t a d o r e s 1 o S e m P r o f. A n d r é A m a r a n t e L u i z L A B 5 tag %2d while printf PE1:

Programação: Tipos, Variáveis e Expressões

1 Resumo: Strings e vetores de caracteres. Departamento de Ciência da Computação IME/USP

Mais sobre Ponteiros em C

Programação e Sistemas de Informação

9 Comandos condicionais

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo

Exercício 1. Tabela 1: Cadastro de usuários, senhas e privilégios (exemplo). Login Senha Privilégio Armamento

Transcrição:

Ponteiros Prof. Edwar Saliba Júnior Outubro de 2012 Unidade 13 Ponteiros 1

Identificadores e Endereços Na linguagem C, uma declaração de variável faz associação entre um identificador e endereços de memória; O número de bytes de memória depende do tipo utilizado na declaração. Unidade 13 Ponteiros 2

Identificadores e Endereços Considere a declaração de uma variável do tipo float, identificada por: Endereços de memória são representados utilizando-se numeração hexadecimal. Após a declaração, os 4 bytes que se iniciam no endereço 0D5 estão reservados e são acessados pelo programa através do identificador x. Unidade 13 Ponteiros 3

Ponteiros Outra forma de acesso a memória é através da utilização do endereço dos bytes. Para isto é necessário utilizar uma entidade chamada de ponteiro; Definição: Ponteiros são variáveis que armazenam endereços de memória; Para declarar uma variável do tipo ponteiro, basta utilizar o símbolo * entre o identificador e o tipo desta. Unidade 13 Ponteiros 4

Conceito Um apontador é uma variável que contém o endereço de uma variável; Considere um tipo t: t* é o tipo apontador para t ; Exemplos: int * float * char * etc. Uma variável do tipo t* contém o endereço de uma variável do tipo t; Dizemos que o apontador aponta para uma variável daquele tipo. Unidade 13 Ponteiros 5

Armazenando Endereços em Ponteiros Para armazenar um endereço em um ponteiro, basta atribuir-lhe o endereço de uma variável de mesmo tipo base: Esquematicamente: Unidade 13 Ponteiros 6

Exemplo de Ponteiros Unidade 13 Ponteiros 7

Aritmética de Ponteiros Seja pa uma variável do tipo ponteiro para inteiros, que está armazenando o seguinte valor: DA3. O comando: soma 4 bytes (tamanho do tipo) no valor de pa que passa a valer: DA7 Ou seja, pa passa a apontar para outro endereço de memória. Unidade 13 Ponteiros 8

Aritmética dos Ponteiros Apenas os operadores aritméticos + e podem ser usados com ponteiros; Incrementos ou decrementos no valor de um ponteiro fará com que este aponte para endereços imediatamente posteriores ou anteriores ao endereço atual, respectivamente; Desta forma, pode-se utilizar ponteiros para percorrer toda a memória de um computador, apenas usando incrementos inteiros de ponteiros. Unidade 13 Ponteiros 9

Operadores Existem 3 operações básicas com apontadores. São elas: Declarar ponteiros: Utiliza-se o operador *; Acessar o conteúdo de uma variável apontada: Utiliza-se o operador unário *, também conhecido como operador de indireção ou indeferência; Copiar o endereço de uma variável: Utiliza-se o operador &. Unidade 13 Ponteiros 10

Exemplos de Apontadores int x = 1, y = 2, z[10]; int *px; // Declaração do ponteiro. px = &x; // px aponta para x, ou seja, recebe // o endereço de x. y = *px; // y recebe o conteúdo do endereço // contido em px. Neste momento y // passa a valer 1. *px = 0; // Neste momento x passa a valer 0. px = &z[0]; // px aponta para z[0]. Opera- px = z; // px = &z[0]; ções idênticas. Unidade 13 Ponteiros 11

Programação de Computadores I Exemplos: Apontadores int x = 1, y = 2, z[10]; int *ip; // Declaração de apontador. ip = &x; // ip aponta pra x ou ip recebe o // endereço de x. y = *ip; // y recebe o conteúdo da variável // apontada por ip, ou seja, y agora // passa a valer 1. *ip = 0; // Altera o conteúdo da variável // aponta por ip para 0 (zero), ou // seja, x passa a valer 0. ip = &z[0]; // ip aponta para z[0]. Unidade 13 Ponteiros 12

Conceito: Programação de Computadores I Apontadores Se ip aponta para x, então *ip pode ocorrer em qualquer lugar onde o x é permitido: int x = 1; int *ip = &x; *ip = *ip + 10; // x = x + 10; y = *ip + 1; // y = x + 1; *ip += 5; // x += 5; ++ *ip; // ++x; (*ip)++; // x++; Parênteses necessários devido a ordem de precedência Unidade 13 Ponteiros das operações. 13

Definições em Sequência Atenção: int a, b, c; // 3 variáveis inteiras. int *pa, pb, pc; // 1 apontador para inteiro // pa e duas variáveis // inteiras pb e pc. Portanto, para evitar confusão e erro: int *pa; int *pb; int *pc; Unidade 13 Ponteiros 14

Ponteiros e Vetores Trabalhar com ponteiros em estruturas sequenciais (strings, vetores e matrizes) pode melhorar o desempenho de programas. O endereço inicial de um vetor corresponde ao nome do mesmo. char s[80], *ps, c; ps = s; // Equivalente a: ps = &s[0]; Atribuir o elemento da posição 4 da string s à variável c: c = s[4]; // Indexação de vetores ou c = *(ps + 4); // aritmética de ponteiros. Unidade 13 Ponteiros 15

Vetores e Apontadores Existe uma relação intrínseca entre arrays e apontadores: int a[10]; define um array a de tamanho 10, que é alocado em um bloco contíguo de memória de tamanho suficiente para conter 10 objetos: a[0], a[1], a[2], a[3],, a[9]. O nome do vetor é o endereço do seu primeiro elemento. int *pa; // Apontador para um inteiro. pa = a; pa = &a[0]; Comandos equivalentes. a == &a[0] Unidade 13 Ponteiros 16

Vetores: Aritmética de Ponteiros Formas de acesso: int a[10]; int *pa; pa = a; int x = *pa; // Copia o valor de a[0] em x. (pa + i) refere-se ao endereço de a[i] *(pa + i) refere-se ao valor armazenado em a[i] (a + i) refere-se ao iésimo elemento do array &a[i] *(a + i) equivale a escrever a[i] pa++ Aponta para o próximo elemento. pa-- Aponta para o elemento anterior. Unidade 13 Ponteiros 17

Vetores e Apontadores Considere: int a[10]; int *pa; pa = a; Diferença importante entre a e pa : o nome do vetor não é uma variável e não pode ser alterado; pa = a; pa++; // Comandos válidos. a = pa; a++; // Comandos inválidos. Unidade 13 Ponteiros 18

Duas Formas de Percorrer Um Array Percorrer um string usando o índice: void percorrecomindice(char v[]){ int i; for(i = 0; v[i]!= 0; i++) use(v[i]); } Percorrer um string usando um apontador: void percorrecomapontador(char v[]){ char *p; for(p = v; *p!= 0; p++) use(*p); } Unidade 13 Ponteiros 19

Alocação Contígua de Memória Demonstração Unidade 13 Ponteiros 20

Alocação Dinâmica de Memória Um vetor de inteiros com tamanho definido pelo usuário em tempo de execução será declarado com um ponteiro de inteiros. int *x, n, i; printf( Digite o tamanho do vetor: ); scanf( %d,&n); // Aloca n posições de tamanho int. x = (int *) calloc(n, sizeof(int)); for(i = 0; i < n; i++){ printf( Digite um valor: ); } scanf( %d,&x[i]); Importante! A memória alocada dinamicamente deve ser liberada pela função free(). free(x); Unidade 13 Ponteiros 21

Alocação Dinâmica de Memória Para matrizes a alocação deverá ser feita em duas etapas: float **m; // Uma matriz de reais. int r, c; // Suas dimensões. int i, j; // Seus índices. Alocar memória para as linhas. printf( Digite a quantidade de linhas: ); scanf( %d,&r); m = (float **) calloc(r, sizeof(float*)); Para cada linha alocar memória para as colunas. printf( Digite a quantidade de colunas: ); scanf( %d,&c); for(i = 0; i < r; i++){ m[i] = (float *) calloc(c, sizeof(float)) } Unidade 13 Ponteiros 22

Representação da Matriz Para liberar a memória: for(i = 0; i < r; i++){ free(m[i]); } free(m); Unidade 13 Ponteiros 23

Verificando a Alocação de Memória Seja p um ponteiro para um tipo qualquer. O seguinte teste: if(p == NULL){ puts( Memória insuficiente para a alocação de \ p\. ); exit(0); } Poderá ser utilizado para verificar se a alocação de memória para o ponteiro p foi bem sucedida. Caso contrário o programa poderá retornar uma mensagem de erro e encerrar a execução. Unidade 13 Ponteiros 24

Bibliografia LAUREANO, Marcos. Programação em C para ambiente Linux. Disponível em: <http://br-c.org/doku.php>. Acesso em: 06 fev. 2011. MURTA, Cristina Duarte. Slides da disciplina de Programação de Computadores I. CEFET-MG, 2010. SENNE, Edson Luiz França. Primeiro Curso de Programação em C. 2. ed. Florianópolis: Visual Books, 2006. SOARES, Gabriela Eleutério. Slides da disciplina de Programação de Computadores I. CEFET-MG, 2011. Unidade 13 Ponteiros 25