Linguagem C : Ponteiros

Slides:



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

Marco Antonio Montebello Júnior
Construção de Algoritmos AULA 07
Programação II Estruturas de Dados
Alocação Dinâmida de Memória
Algoritmos e Programação Linguagens de Programação Teoria Aula (09/06)
Algoritmos e Estrutura de Dados I
Linguagem C LPG-I – Variáveis Estruturadas – Vetores
LPG - I: Alocação Dinâmica de Memória - Ponteiros
Ponteiros em C.
LPG - I: Ponteiros e Vetores/Matrizes UDESC - SBS
Estruturas de Dados II 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.
Vetores, Matrizes e Funções
Ponteiros em Linguagem C
Ponteiros.
Revisão da Linguagem C.
Apontadores ou Ponteiros
INTRODUÇÃ A COMPUTAÇÃO ENG. CIVIL
Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba
O Portal do Estudante de Computação
Introdução a Computação e Cálculo Numérico
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 6 Vetores e Matrizes
1 Ponteiros Ponteiros são variáveis que guardam localizações em memória. A declaração de uma variável ponteiro x para um dado tipo type é type *x; Essa.
PROGRAMAÇÃO ESTRUTURADA II
PROGRAMAÇÃO ESTRUTURADA II
Definição de Tipos Estruturas e Ponteiros
CADEIA DE CARACTERES (Strings)
Construção de Algoritmos Professor: Aquiles Burlamaqui Construção de Algoritmos AULA 07 Aquiles Burlamaqui UERN
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.
Introdução a Linguagem de Programação C
PROGRAMAÇÃO I PONTEIROS.
Aula prática 6 Vetores e Matrizes
UNIDADE 5 ESTRUTURAS DE DADOS HOMOGÊNEAS
Professor Mário Dantas
Prof. Ricardo Santos PONTEIROS
Curso de C/C++ Aula 2 Instrutor: Luiz Felipe Sotero
Técnicas de Desenvolvimento de Programas
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Capítulo V – Comandos de Entrada e Saída 5.1 – Equipamentos de entrada e saída 5.2 – Saída no vídeo-texto 5.3 – Entrada pelo teclado 5.4 – Entrada e saída.
Algoritmos e Estrutura de Dados I Jean Carlo Mendes
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
Programação de Computadores I – Arquivos
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
Linguagem C.
CES-10 INTRODUÇÃO À COMPUTAÇÃO
Algoritmos e Programação MC102 Prof. Paulo Miranda IC-UNICAMP Aula 2 Variáveis e Atribuições.
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.
Programação Computacional Aula 8: Entrada e Saída pelo Console Prof a. Madeleine Medrano
Programação Computacional Aula 9: Meu primeiro programa em C
Profa. Maria Augusta Constante Puget
Ponteiros em C Prof. Kariston Pereira
Linguaguem de Programação II
Introdução à Linguagem C
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.
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.
FUNÇÕES Dilvan Moreira (baseado em material de Z. Liang)
Transcrição da apresentação:

Linguagem C : Ponteiros Material de apoio: http://www.mlaureano.org/livro/Programando_C_conta.pdf http://www.ime.usp.br/~pf/algoritmos/aulas/pont.html http://pt.wikibooks.org/wiki/Programar_em_C/Ponteiros

Endereços A memória do computador é uma sequência de bytes. Cada byte armazena um de 256 possíveis valores. Os bytes são numerados sequencialmente. O número de um byte é o seu endereço (= address). Cada objeto na memória do computador ocupa um certo número de bytes consecutivos. No meu computador, um char ocupa 1 byte, um int ocupa 4 bytes e um double ocupa 8 bytes. Cada objeto na memória do computador tem um endereço. Na maioria dos computadores, o endereço de um objeto é o endereço do seu primeiro byte.

Endereços O endereço de uma variável é dado pelo operador &. Não confunda o uso de "&" com o operador lógico and, que em C se escreve "&&”.  Se  i  é uma variável então  &i  é o seu endereço.  Exemplo: O segundo argumento da função scanf é o endereço da posição na memória onde devem ser guardados os objetos lidos no dispositivo padrão de entrada: int i; scanf ("%d", &i);

Endereços Exemplo: char ccc; ccc = ‘z’; Endereço da variável pode ser ccc = 89421 (valor hipotético). Neste caso &ccc é o endereço de ccc. Portanto &ccc vale 89421 enquanto ccc vale ‘z’.

Endereços Para maiores informações referentes ao funcionamento do gerenciamento de memória de um computador recomendo a leitura do seguinte livro, em especial o capítulo 3. TANENBAUM, Andrew S.. Sistemas operacionais modernos. 3. ed. São Paulo: Pearson, 2010. 672 p. Para esta disciplina basta saber que o endereço de memória é um número tratado e fornecido pelo sistema operacional.

Ponteiros Um ponteiro é simplesmente uma variável que armazena o endereço de outra variável. O ponteiro é um tipo de dado como int, char ou float. Um ponteiro aponta para algo. Em programação, temos as variáveis armazenadas na memória, e um ponteiro aponta para um endereço de memória. Imagine as variáveis como documentos, a memória do computador como pastas para guardar os documentos, e o ponteiro como atalhos para as pastas.

Ponteiros O maior problema em relação ao ponteiro é entender quando se está trabalhando com o seu valor (o endereço) e quando se está trabalhando com a informação apontada por ele. Por ser um endereço, deve-se especificar que tipo de variável será encontrado na posição apontada pelo ponteiro. Assim é informado que foi criado um ponteiro para um inteiro, um ponteiro para uma estrutura ou um ponteiro para um arquivo.

Ponteiros Para declarar um ponteiro, especificamos o tipo da variável para a qual ele aponta e seu nome precedido por asterisco. Pode-se ter um ponteiro para qualquer tipo de variável possível em C. Não confunda o uso de "*" com o operador de multiplicação! tipo * variável; int *a; /*ponteiro para inteiro */ char *b; /*ponteiro para um caractere */ float *e; /*ponteiro para um ponto flutuante */

Ponteiros Um ponteiro pode ser utilizado de duas maneiras distintas: Trabalhar com o endereço armazenado no ponteiro; Trabalhar com a área de memória apontada pelo ponteiro. Quando se quiser trabalhar com o endereço armazenado no ponteiro, utiliza-se o nome sem o asterisco na frente. Qualquer operação realizada será feita no endereço do ponteiro. O mais indicado é trabalhar com área de memória indicada pelo ponteiro, alterando ou lendo o valor desta área. Coloca-se um asterisco antes do nome do ponteiro (*nome). Desta forma o compilador entenderá que deve ser acessada a memória e não o endereço do ponteiro.

Ponteiros Para acessar o endereço de uma variável, utilizamos o operador unário &. Ele retorna o endereço na memória de seu operando. Por exemplo, se uma variável nome foi guardada no endereço de memória 1000, a expressão &nome valerá 1000.

Ponteiros A variável a contém o valor 1234 e o ponteiro p contem o endereço de a (&a). int a; int *p; p = &a; Também poderia ter sido inicializado assim: int *p = &a;

Ponteiros Cuidado! Você nunca deve usar um ponteiro sem antes inicializá-lo: int *p; *p = 9; Nesse exemplo é manipulado um lugar desconhecido da memória. Ao compilar esse código, o compilador deverá dar uma mensagem de aviso; durante a execução, provavelmente ocorrerá uma falha de segmentação. Caso interessante: um ponteiro r para outro ponteiro que apontará um inteiro é declarado assim: int **r;

Erros Segmentation Fault: Ocorre quando um programa tenta acessar um endereço na memória que está reservado ou que não existe. Especificador de conversão (%) errado: Versões antigas do C aceitavam o especificador %d para endereços de ponteiros, as versões mais novas somente aceitam o especificador %p. Todos os exemplos do capítulo 11 do livro do laureano utilizam a notação antiga. Cuidado!

Exemplo (no Dropbox)

Ponteiros como parâmetros de funções Uma função que troca os valores de duas variáveis inteiras, i e j. void troca (int i, int j) /* errado! */ { int temp; temp = i; i = j; j = temp; } Está errada, pois recebe apenas os valores das variáveis e não as variáveis propriamente ditas. A função recebe "cópias" das variáveis e troca os valores dessas cópias, enquanto as variáveis "originais" permanecem inalteradas.

Ponteiros como parâmetros de funções Para obter o efeito desejado, é preciso passar à função os endereços das variáveis. void troca (int *p, int *q) { int temp; temp = *p; *p = *q; *q = temp; } Para utilizar a função diretamente: troca (&i, &j); Para utilizar a função sem ponteiros na chamada: int *p, *q; p = &i; q = &j; troca (p, q);

Operações com Ponteiros É possível realizar as operações de soma e subtração do valor do ponteiro, ou seja, do endereço armazenado na variável. A soma estará́ condicionada ao tamanho do tipo que o ponteiro aponta. Suponha que exista um ponteiro para um inteiro, que ocupa 4 bytes na memória. Ao se somar uma unidade neste ponteiro (+ 1) o compilador interpretará que se deseja somar um valor que permita acessar o próximo inteiro e irá gerar código para somar 4 unidades no endereço do ponteiro.

Operações com ponteiros Supondo dois ponteiros inicializados p1 e p2: p1 = p2; Assim p1 aponta para o mesmo lugar que p2. Usar p1 será equivalente a usar p2. *p1 = *p2; Iguala os valores apontados. Alterara o valor apontado por p1 para o valor apontado por p2.

Operações com ponteiros Incrementar o ponteiro. Ele passa a apontar para o próximo valor do mesmo tipo. Se o ponteiro é para um inteiro e é incrementado, passa a apontar para o próximo inteiro. (*p)++; Altera o valor apontado por p. Incrementa o conteúdo da variável apontada pelo ponteiro p.

Ponteiros e Matrizes Quando é passado um vetor ou matriz como parâmetro, a linguagem C coloca o endereço na pilha. Pode-se então definir o tipo do parâmetro como um ponteiro e acessar a matriz dentro da função como se fosse um ponteiro:

Ponteiros e Strings Acessar um vetor como ponteiro e vice-versa é muito comum quando são utilizadas strings. Quando é definido um vetor de caracteres, pode-se acessá-lo através de um ponteiro para caractere. Este ponteiro estará sempre apontando para um único caractere da string e através de operações sobre o ponteiro (incremento ou decremento) pode-se caminhar no vetor.

Ponteiros para funções Um ponteiro para uma função contém o endereço da função na memória. Um nome de função é o endereço inicial na memória do código que realiza a tarefa da função. Os ponteiros para funções podem ser passados para funções , retornados de funções, armazenados em arrays e atribuídos a outros ponteiros para funções. Possibilita passar uma função como argumento para outra função.

Ponteiros para funções tipo_de_retorno (*nome_do_ponteiro)( ); ou tipo_de_retorno (*nome_do_ponteiro)(declaração_de_parâmetros); No exemplo a seguir a função PrintString() usa uma função qualquer func para imprimir a string na tela. O programador pode então fornecer não só a string mas também a função que será usada para imprimi-la. No main( ) podemos atribuir, ao ponteiro para funções p, o endereço da função puts() do C.

Ponteiros para funções

Exercícios 1) Explique o código a seguir. 2) Explique o seguinte código: #include <stdio.h> int main () int main() { int i; int vetorTeste[3] = {4, 7, 1}; int *ptr = vetorTeste; int i = 0; printf("%p\n", vetorTeste); while (ptr <= &vetorTeste[2]) printf("%p\n", ptr); printf("%p\n", &ptr); printf("O endereço do índice %d do vetor é %p\n", i, ptr); printf("O valor do índice %d do vetor é %d\n", i, *ptr); for (i = 0; i < 3; i++) ptr++; i++; printf("O endereço do índice %d do vetor é %p\n", i, &ptr[i]); printf("O valor do índice %d do vetor é %d\n", i, ptr[i]); } return 0;

Exercícios 3) Faça um programa que calcule a circunferência do círculo e área do circulo usando ponteiros para funções. 4)Utilize ponteiros como parâmetros de função para escrever um programa que calcula o seno, cosseno, tangente e secante.