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

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

3. Linguagem de Programação C

Programação Estruturada

Introdução à Programação

Estruturas de Dados Homogêneas (Vetores e Matrizes) e Ponteiros em C

ponteiros INF Programação I Prof. Roberto Azevedo

Linguagem C ponteiros

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

Ponteiros. Introdução e Alocação Dinâmica

Aula 24 Ponteiros, vetores e structs

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

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

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

INF 1007 Programação II

Ponteiros. Baseado nos slides do Prof. Mauro.

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

Estruturas. K&R: Capitulo 6. Estruturas IAED, 2014/2015. Introdução às Estruturas Estruturas e Funções Vectores de Estruturas Typedef Exemplo

Introdução a Programação. Tipos Estruturados de Dados

11a. Aula Ponteiros e Vetores

Alocação Dinâmica em C

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Ponteiros. Introdução

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

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

Estruturas de Dados Aula 2: Estruturas Estáticas. Tipos Básicos. Quantos valores distintos podemos representar com o tipo char?

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

Objetivo. Compreender a definição e dominar a implementação de ponteiros em C. Dominar a manipulação de arquivos

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

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

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

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

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

Introdução. Ponteiros

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

LINGUAGEM C Estrutura / Funções

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

Ponteiros e Alocação de Memória

Estruturas de Dados. Revisão de Funções e Recursão. Agradecimentos

Tipos Abstratos de Dados. Estrutura de Dados

Alocação Dinâmica de Memória

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

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA

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

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.

Linguagem C. Ponteiros. Alex Vidigal Bastos.

Introdução à Ciência da Computação. Sumário. Modularização de Algoritmos. Agradecimentos. Modularização de Algoritmos e Funções em C

Programação: Vetores

MC-102 Aula 21 Registros

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

Introdução a Computação

Linguagem C: Ponteiros. Prof. Tiago Alves de Oliveira

FUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara

DAS5102 Fundamentos da Estrutura da Informação

Linguagem C: Ponteiros. Prof. Leonardo Barreto Campos 1

Linguagem C Ponteiros

Linguagem C. André Tavares da Silva.

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

Aula 25: Alocação Dinâmica

Reinaldo Gomes Alocação Dinâmica

USP - ICMC - SSC SSC o. Semestre Disciplina de Introdução à Computação para Engenharia Ambiental

Introdução à Computação

Introdução a Programação de Jogos

Aula 24: Ponteiros e Alocação Dinâmica

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

Estrutura de Dados. Cadeia de Caracteres. Roberto Araujo Ago/2013

ESTRUTURAS COMPOSTAS. REGISTROS (Struct) Introdução à Ciência da Computação I Simone Senger Souza

PROGRAMAÇÃO DE COMPUTADORES V - TCC Modulo 6 : Funções Escopo de Variáveis: Globais x Locais Aura - Erick

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

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

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

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

Mais sobre Ponteiros em C

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

Algoritmos e Programação

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

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

Linguagem C: Subprogramação

BCC202 - Estrutura de Dados I

Linguagem de Programação

Métodos Computacionais. Tipos Estruturados

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

3. Linguagem de Programação C

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

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

Lista de Exercícios de Algoritmos - 04 Para cada um dos exercícios abaixo, faça um programa (em laboratório) que teste a função.

Linguagem de Programação C. Ponteiros

ESTRUTURAS COMPOSTAS. REGISTROS (Struct) Introdução à Ciência da Computação I Simone Senger Souza

Aula 18: Funções em C

Programação de Computadores I Funções Básicas da Linguagem C PROFESSORA CINTIA CAETANO

Programação 5374 : Engenharia Informática 6638 : Tecnologias e Sistemas de Informação. Cap. 7 Arrays. Arrays

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

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

Tipos Abstratos de Dados

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e recodificações em C dos originais:

Transcrição:

Introdução à Ciência da Computação Ponteiros em C Prof. Ricardo J. G. B. Campello Sumário Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C Operações Ponteiros e Arranjos Passagem de Parâmetros por Referência 2 Introdução Por quê ponteiros são importantes? Permitem passagem de parâmetros para funções por referência Permitem alocar e liberar memória dinamicamente (em tempo de execução) Possibilitam a implementação eficiente de certas estruturas de dados Definição Um ponteiro (ou apontador) é uma variável que armazena um endereço de memória Normalmente, esse endereço é a posição de outra variável na memória Dizemos portanto que um ponteiro aponta para uma variável O tipo do ponteiro é normalmente associado ao tipo da variável apontada 3 4

Definição Declaração em C Exemplo: 1002 1003 1004 1005 1006... conteúdo de A 1003 A P (ponteiro) tipo *var1, *var2,...; O símbolo * indica que as variáveis var1, var2, etc. são ponteiros para variáveis do tipo tipo Alternativamente pode-se declarar como: tipo* var1, var2,...; Exemplos:... float *a, *t23, *lista; 5 int* b, s2; 6 Manipulação em C Manipulação em C Operadores: Atribuição (P1 e P2 ponteiros A, B e C variáveis): Operador de endereço: & Ponteiros só podem receber endereços de memória Para isso, pode-se utilizar o operador & Operador de conteúdo: * Recupera o conteúdo da variável apontada por um ponteiro Ponteiro nulo: NULL Um ponteiro que recebe o valor NULL aponta para nada 7 Endereço de Variável para Ponteiro Exemplos: P1 = &A; P2 = &B; Conteúdo de Endereço Apontado para Variável Exemplo: C = *P2; Ponteiro para Ponteiro (ou para nulo) Exemplos: P1 = P2; P2 = NULL; Conteúdo para Endereço Apontado Exemplos: *P1 = A; *P1 = 34; 8

Manipulação em C Manipulação em C Exemplo: 3.123 3.123 2.456 2.456 1.789 2.456 2.456 1.789 #include <stdio.h> void main(void){ float A, B, *P1, *P2; A = 3.123; printf("%f\n", A); P1 = &A; printf("%f\n",*p1); *P1 = 2.456; printf("%f\n",a); P2 = P1; B = *P2; printf("%f\n",b); B = 1.789; P2 = &B; printf("%f\n%f\n%f\n%f",b, A, *P1, *P2); 9 Comparação: Como para qualquer variável Exemplos: if (P1 == P2) /* Verifica se P1 e P2 apontam para o mesmo endereço */ if (P1 == NULL) /* Verifica se P1 aponta para NULL */ 10 Ponteiros para Estruturas Ponteiros para Estruturas Podemos declarar ponteiros para estruturas Por exemplo: struct estrutura { float campo1; char campo2; struct estrutura est, *pt; Na verdade, é possível declarar ponteiros para tipos definidos pelo usuário em geral No exemplo anterior, poderíamos definir o tipo: typedef struct { float campo1; minha_estrutura est, *pt; char campo2; minha_estrutura; Em qualquer caso, o acesso aos campos de uma estrutura através de um ponteiro demanda o operador seta ( > ) 11 12

Ponteiros para Estruturas Ponteiros e Arranjos No exemplo anterior, poderíamos utilizar o operador seta para acessar os campos da var. composta est através de um ponteiro pt pt = &est; printf("o valor do campo1 é %f", pt->campo1); printf("o valor do campo2 é %c", pt->campo2); Notas: Operador -> acessa conteúdo, não endereço! pt->campo1 é equivalente a est.campo1 Há uma relação estreita entre ponteiros e arranjos (vetores e matrizes) em linguagem C Por exemplo, considere as seguintes declarações: char str[10], *p1; vetor de 10 chars (string) e ponteiro para chars As seguintes atribuições são equivalentes: p1 = str ou p1 = &str[0] o nome do vetor referencia o endereço do seu 1º elemento o mesmo vale para matrizes, armazenadas linearmente em memória como se fosse um vetor, linha por linha 14 Ponteiros e Arranjos Ponteiros e Arranjos Há uma relação estreita entre ponteiros e arranjos (vetores e matrizes) em linguagem C Por exemplo, considere as seguintes declarações: char str[] = {'b', 'l', 'a', 'b', 'l', 'a', 'b', 'l', 'a', '\0', *p1; vetor de 10 chars (string) e ponteiro para chars As seguintes expressões são equivalentes: str[5] ou *(str + 5) ambas representam o conteúdo do sexto elemento da string ( a ) lembrando que arranjos em C são indexados a partir de zero 15 Nota 1: embora o nome do arranjo referencie seu 1º elemento, não podemos atribuir ou modificar o valor deste como se fosse um ponteiro qualquer ou perderíamos a referência para o início do arranjo... Por exemplo, o seguinte trecho de código não compila: char str[]={'b', 'l', 'a', 'b', 'l', 'a', 'b', 'l', 'a', '\0'; while (*str!= '\0'){ printf("%c", *str); str++; Para corrigir: char* p1 = str; while (*p1!= '\0'){ printf("%c", *p1); p1++; 16

Ponteiros e Arranjos Relembrando Funções... Nota 2: a relação entre arranjos e ponteiros é tão próxima que um ponteiro para um arranjo pode ser indexado como se o próprio arranjo fosse (sem *) Por ex., o código anterior poderia ser rescrito como: char str[10] = "blablabla", *p1; int i; p1 = str; for (i=0; i<9; i++) printf("%c", p1[i]); Escopo: As variáveis declaradas dentro de uma função possuem escopo local, ou seja, provisório e interno à função Variáveis globais são declaradas no início de qualquer módulo (arquivo) de programa, fora de qualquer função (incluindo main) Passagem de Parâmetros: Em geral, por valor (uma cópia do parâmetro é feita) Em C ANSI, isso inclui structs Para forçar passagem por referência, é preciso utilizar ponteiros 17 É o que ocorre necessariamente com arranjos (vetores/matrizes) 18 Funções e Ponteiros Passagem por Referência Alterações feitas nos parâmetros recebidos são refletidas nos valores passados como argumentos O endereço do argumento é passado no momento da chamada da função endereço do argumento = ponteiro Por que Passagem por Referência? Em muitas situações em programação, a passagem de parâmetros por valor não é apropriada Por exemplo, a função abaixo é inócua: void troca(int x, int y){ int temp; temp = x; x = y; y = temp; pois não altera as variáveis passadas como parâmetros, altera apenas as cópias dos seus valores feitas em x e y tais cópias desaparecem ao final da execução da função 20

Passagem de Ponteiros Passagem de Ponteiros Para forçar uma passagem por referência, é preciso utilizar ponteiros Nesse caso, a função do exemplo anterior fica: void troca(int *x, int *y){ int temp; temp = *x; *x = *y; *y = temp; e troca os valores contidos nos endereços passados como parâmetro Veja como fica uma chamada à função anterior: void main(void){ int temp, a = 10, b = 20; printf("%d %d\n", a, b); troca(&a, &b); printf("%d %d", a, b); Isso explica a sintaxe de scanf (ou seja, por que devemos incluir o operador & antecedendo as variáveis a receberem valores)??? também explica por que isso não se faz necessário no caso de strings...? 21 22 Passagem de Ponteiros Passagem de Ponteiros A passagem de arranjos para funções é uma exceção à convenção de passagem por valor da linguagem C Quando uma função possui um arranjo (vetor/matriz) como parâmetro, apenas uma cópia do endereço do arranjo é passada na chamada, não uma cópia do arranjo todo Como já sabemos, o endereço do arranjo é um ponteiro para o seu 1º elemento e é referenciado pelo seu próprio nome Exemplo: Função para imprimir string sem usar fprintf("%s", var) Exemplo: void imprime_string(char *st) { while (*st!= '\0'){ printf("%c", *st); st++; Formas alternativas equivalentes: void imprime_string(char* st) {... void imprime_string(char st[]) {... Exemplos de chamada: imprime_string("alo!"); imprime_string(var); /* var = vetor de chars (string) */ 23 24

Passagem de Ponteiros Outros Tópicos sobre Ponteiros Exemplo: #include <stdio.h> void imprime_vetor(int *v, int tamanho); void main(void){ int vet[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10; imprime_vetor(vet, 10); void imprime_vetor(int *v, int tamanho) { int cont; for (cont=0; cont<tamanho; cont++) printf("%d\n", v[cont]); Ponteiros para Alocação Dinâmica de Memória Funções que Retornam Ponteiros Matrizes de Ponteiros Ponteiros para Ponteiros Ponteiros para Funções... Para saber mais... (Schildt, 1997) (Damas, 2007) 26 Exercícios Exercícios Explique o que será apresentado como resultado do seguinte código em C: #include <stdio.h> void main(void){ int A=1, B=2, C=3, *P1, *P2, *P3; P1 = &B; P2 = P1; P3 = &C; *P2 = 5; C = *P1; P1 = &A; *P1 = *P3; printf("%d\n%d\n%d",a, B, C); Definir um tipo de registro (struct) com três campos: um campo numérico real, um campo caractere e um campo dado por um vetor de inteiros Declarar um registro do tipo acima Declarar um ponteiro para esse tipo de estrutura e apontá-lo para o registro declarado no item anterior Atribuir valores aos campos do registro utilizando o ponteiro (ou seja, o operador seta, ao invés do operador ponto) 27 28

Exercícios Faça uma função que recebe como parâmetros três ponteiros para vetores de inteiros, todos do mesmo tamanho, tamanho este que também é passado como parâmetro para a função. Essa função deve fazer com que cada célula do terceiro vetor se torne igual à soma das células correspondentes dos outros dois Exercícios Faça uma função que recebe como parâmetro uma string (vetor de caracteres) e o respectivo número de caracteres válidos (tamanho da string, sem contar o \0) como parâmetros. Essa função deve inverter a string, ou seja, fazer com que ela apareça de trás para frente caso seja escrita. 29 30 Bibliografia Schildt, H. "C Completo e Total", 3a. Edição, Pearson, 1997. Damas, L. Linguagem C, 10a. Edição, LTC, 2007 31