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

Documentos relacionados
Linguagem C: Ponteiros. Prof. Tiago Alves de Oliveira

Linguagem C: Ponteiros. Prof. Leonardo Barreto Campos 1

3. Linguagem de Programação C

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.

11a. Aula Ponteiros e Vetores

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

Linguagem de Programação C. Ponteiros

Fundamentos de Programação

Algoritmos e Programação

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

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

Programação: Vetores

Aula 20 - Ponteiros. Prof. Laura Silva de Assis. Engenharia de Computação. CEFET/RJ - Centro Federal de Educação Tecnológica Celso Suckow da Fonseca

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

TÉCNICAS DE LINGUAGEM DE PROGRAMAÇÃO

Alocação Dinâmica em C

Introdução à Computação

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

LINGUAGEM C: PONTEIROS

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

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

Aula 24 Ponteiros, vetores e structs

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

Aula 27: Estruturas heterogêneas e alocação dinâmica

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

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

Aula 9 Agregado Heterogêneo Ponteiro. prof Leticia Winkler

Linguagem C: Introdução

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

Tipos Abstratos de Dados. Estrutura de Dados

Linguagem C Ponteiros

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

Introdução a Programação de Jogos

ponteiros INF Programação I Prof. Roberto Azevedo

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

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

Ponteiros. Introdução

PROGRAMAÇÃO A. Vetores

Introdução à Programação

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

Computação eletrônica:

É o asterisco (*) que faz o compilador saber que aquela variável não vai guardar um valor e sim um endereço para aquele tipo especificado.

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

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

Introdução à Programação Estruturada Parte 3. Material da Prof. Ana Eliza

Aula 26: Estruturas heterogêneas

Computação Eletrônica. Vetores e Matrizes. Prof: Luciano Barbosa. CIn.ufpe.br

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

Funciona como uma matriz unidimensional, mas tem mais de um índice. Sintaxe:

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

Matrizes em C. Lucas Ferrari de Oliveira Professor Adjunto. Universidade Federal do Paraná

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

Variáveis, Tipos de Dados e Operadores

Módulo 5 Vetores e Alocação Dinâmica

3. Linguagem de Programação C

Programação I Funções. Prof. Carlos Alberto

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

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

Introdução. Ponteiros

19 - Ponteiros em C Parte 1

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO

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: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

ESTRUTURA DE DADOS (TCC )

Estrutura de dados 1. Ponteiros

Programação I Ponteiros e alocação dinâmica de memória. Prof. Carlos Alberto

Computação Eletrônica. Strings. Prof: Luciano Barbosa. CIn.ufpe.br

Fundamentos de Programação

Módulo 1. Introdução. AEDS I C++ (Rone Ilídio)

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

Aula 25: Alocação Dinâmica

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

Funções em Linguagem C Parte II

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

Algoritmos e Programação

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

LINGUAGEM C: ARRAY: VETORES E MATRIZES

prim = A ; prim = &A[0];

Aula 4: Introdução à Linguagem C++

Aula 23: Ponteiros Introdução a Programação Túlio Toffolo & Puca Huachi

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

Ponteiros. Baseado nos slides do Prof. Mauro.

Puca Huachi Vaz Penna

ANHANGUERA ESTRUTURA DE DADOS AULA 04 MATRIZES, LISTAS E ALOCAÇÃO DINÂMICA. Prof. Thomás da Costa

Aula 25: Alocação Dinâmica

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

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

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

Ponteiros de Variáveis

Introdução à Computação

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

Estruturas de Dados. Profa. Juliana Pinheiro Campos

Programação Estruturada

Vetores e matrizes. MCTA028 Programação Estruturada. Material preparado a partir de slides dos profs. Jesús Mena-Chalco e Fabrício Olivetti

ESTRUTURAS COMPOSTAS

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

Vetores e Strings. 6. Comandos de entrada e saída formatada que trabalham sobre strings

Algoritmos II prof. Daniel Oliveira

1. Revisão de Vetores, Ponteiros, Funções e Estruturas em C

Transcrição:

Centro Universitário Franciscano Curso de Sistemas de Informação Disciplina de algoritmos e programação II Ponteiros Profa.: Simone Ceolin Slides (Prof.Tiago Rios da Rocha) Primeiro Semestre 2011

Sumário Definição Declaração de ponteiros Inicialização de ponteiros Usos do * e & Operações com ponteiros Vetores e ponteiros Ponteiros e vetores multidimensionais Vetores de ponteiros Ponteiros de ponteiros

Definição

Introdução Para nós é facil de entender que: "a" é igual ao valor 5. "ch" é igual ao valor 'x'. "a" ou "ch" para o compilador são endereços de memória. São lugares de memória que contém, no caso de "a" um inteiro com valor 5 e no caso de "ch" um caractere com valor 'x'.

O que é um ponteiro? Um ponteiro é uma variável que contém o endereço de uma outra variável Toda variável declarada em um programa tem um endereço de memória alocado para si e o número de posições de memória alocado depende do seu tipo. Ponteiros podem apontar (receber o endereço) para variáveis de qualquer um dos tipos disponíveis na linguagem. Ponteiros são importantes para: alocação dinâmica de memória, passagem de parâmetros para funções

O que é um ponteiro? As variáveis simples e arrays podem ser considerados ponteiros cujo endereços são constantes e que indicam lugares na memória de dados. Funções podem ser considerados ponteiros que armazenam um endereço de memória de programa

O que é um ponteiro? Um ponteiro é uma variável que guarda um endereço de memória de outro objeto. Esse endereço é a localização de outra variável na memória, embora ele possa ser o endereço de uma porta ou um endereço com propósito especial na RAM, como uma área auxiliar (buffer). Se uma variável contém o endereço de uma outra variável, a primeira é conhecida como um ponteiro para a segunda.

Variáveis possuem nome, endereço e conteúdo #include <iostream> using namespace std; int dog, cat, bird, fish; void f(int pet) { printf("%d",pet); } int main() { int i, j, k; }

Declaração de ponteiros

Declaração de um Ponteiro: * Tipo_de_ponteiro *nome_da_variável; Int *valor1; Float *valorx; Char *valory; Indica que a variável não armazena um valor, mas sim um endereço para o tipo especificado.

A importância do & O operador endereço & é usado para indicar o endereço de uma variável. Sempre que desejamos fazer um ponteiro apontar (receber o endereço) para uma variável temos que usar este operador. Ponteiro = &variavelinteira;

Inicialização de ponteiros

Inicialização de um Ponteiro: ATENÇÃO: Todos ponteiros devem ser inicializados Ponteiro = &variável; Ponteiro = NULL; Main() { Int valor1, *ponteiro; valor1 = 25; ponteiro = &valor1; } Memória HAM ENDEREÇO NOME CONTEÚDO 0000000001 valor1 25 0000000002 ponteiro 0000000001

Usos do * * Multiplicação; Declaração de ponteiro. É interpretado como a declaração de uma variável do tipo ponteiro; Utilizado como operador de conteúdo. Será interpretado como o conteúdo do endereço apontado pelo ponteiro;

Como alterar o conteúdo de uma variável através de um ponteiro? Main() { Int valor1 = 10,*ponteiro; printf( valor1: %d\n,valor1); Ponteiro = &valor1; *ponteiro = 15; printf( valor1: %d\n,valor1); }

Exercício 1: Na main() crie uma variável chamada num do tipo int com o valor 10. Crie um ponteiro que aponte para a variável num; Crie uma função que receba o endereço da variável num e altere o valor para 15 através do uso de ponteiros; Na main() mostre o valor da variável num;

Exercício 2: Crie um programa que declare duas variáveis (inteiro e real) atribua valores para elas e crie dois ponteiros, cada um apontando para uma destas variáveis. Mostre na tela: O valor e o endereço de memória das variáveis, o valor do ponteiro, o endereço do ponteiro e o valor apontado pelo ponteiro.

Operações com ponteiros

Operações com ponteiros Atribuição de ponteiros: Como qualquer variável, um ponteiro pode ser usado no lado direito de uma declaração para atribuir seu valor para um outro ponteiro. Por exemplo: #include <stdio.h> void main(){ int x; int *p1, *p2; x = 101; p1 = &x; p2 = p1; printf( Endereço da variavel: %p, p2); //imprime o endereço de x printf( Valor da variável: %d, *p2); //imprime o valor de x }

Operações com ponteiros: É possível realizar adição e subtração sobre ponteiros buscando-se endereços de memória (apontando-se para valores) que estejam acima (adição) ou abaixo (subtração) do endereço atual contido no ponteiro. Por exemplo, para um ponteiro de nome p, a operação p++ faz com que p passe a apontar para o próximo elemento, qualquer que seja o tipo de objeto para o qual p aponta. Já p += i (p = p + i), faz com que p passe a apontar i elementos além (acima) do objeto para o qual p aponta atualmente.

Operações com ponteiros Incremento: p++; Decremento: p--; Adição: p = p+2; Subtração: p = p 2; Atenção: Se um ponteiro para um inteiro for incrementado, ele passa a apontar para o próximo inteiro.

Operações com ponteiros Exercício: Crie uma variável int e atribua um valor qualquer; Crie um ponteiro que aponte para esta variável; Utilizando ponteiros, imprima na tela o valor contido na variável. Imprima os conteúdos das próximas 1000 posições inteiras na memória.

Operações com ponteiros Comparação entre ponteiros: ==!= Compara se os ponteiros são iguais ou diferentes >, <, <=, >= Compara qual ponteiro aponta para a posição mais alta na memória

Operações com ponteiros Exercício: Crie duas variáveis inteiras, crie dois ponteiros que apontem para as variáveis anteriores. Compare os dois ponteiros e mostre na tela qual ponteiro está mais a adiante na memória.

Ponteiros e vetores

Ponteiros e vetores A forma de acesso a vetores, vista anteriormente, usava um índice para acessar cada elemento do vetor. vetores unidimensionais vetorx[3]; COMO O NOME DE UM VETOR É, NA REALIDADE, UM PONTEIRO PARA O PRIMEIRO ELEMENTO DO VETOR DECLARADO, pode-se usar este nome (ponteiro) como uma forma de acesso alternativa e mais ágil que a usual (via índices).

Ponteiros e vetores Para acessar o primeiro elemento de um vetor de nome valores: elem = valores[0]; ou elem = *valores; Para acessar o segundo elemento: elem = valores[1]; ou elem = *(valores + 1);

Ponteiros e vetores

Ponteiros e vetores Exercício: Crie um vetor de 10 posições, utilizando a maneira vista anteriormente de acessar ponteiros, adicione valores digitados pelo usuário em cada posição do vetor, logo, utilizando o mesmo método, exiba seu conteúdo na tela.

Ponteiros e vetores char str[80], *p1; p1 = str; p1 foi associado ao endereço do primeiro elemento da matriz em str. Na linguagem C, um nome de matriz sem um índice é o endereço para o começo da matriz. O mesmo resultado, um ponteiro para o primeiro elemento da matriz str, pode ser gerado com a declaração abaixo: p1 = &str[0];

Ponteiros e vetores Se você desejar acessar o 5º elemento de um vetor pode ser feito das seguintes maneiras: str[4]; Ou Frequentemente o uso de aritmética é mais rápido do que o uso de indexação *(p1+4)

main () { } int *ponteiro, vetor_inteiros[4] = {0, 10, 20, 30}; ponteiro = &vetor_inteiros[0]; printf( Valor apontado: %d \n, *(ponteiro+2) ); O COMPILADOR C AUTOMATICAMENTE RECONHECE O TIPO BÁSICO DO PONTEIRO E PULA A QUANTIDADE DE ENDEREÇOS RESPECTIVOS.

main () { int *ponteiro, vetor_inteiros[4] = {0, 10, 20, 30}; ponteiro = &vetor_inteiros[0]; O COMPILADOR C AUTOMATICAMENTE RECONHECE O TIPO BÁSICO DO PONTEIRO E PULA A QUANTIDADE DE ENDEREÇOS RESPECTIVOS. } ponteiro += 2; /* igual a: ponteiro = &vetor_inteiros[2]; */ printf( Valor apontado: %d \n, *ponteiro);

Ponteiros e vetores: Exercício: Na main(), crie um vetor chamado v1 com 10 posições; Crie uma função que receba v1 e atribua em todas as posições do vetor valores recebidos do teclado (utilizando ponteiros); Crie funções ( sempre usando ponteiros) para informar ao usuário: 1. o maior valor no vetor; 2. o menor valor no vetor; 3. o valor médio armazenado no vetor; 4. e o número de valores negativos no vetor.

Ponteiros e vetores Obtendo o endereço de um elemento da matriz: É possível atribuir o endereço de um elemento específico de um vetor aplicando-se o operador & para o vetor indexado. p = &x[2];

Ponteiros e vetores: Essa declaração é especialmente útil para encontrar uma substring. O programa abaixo imprimirá o restante de uma string, que é inserida pelo teclado, a partir do primeiro espaço é encontrado. #include <stdio.h> void main() { char s[80]; char *p; int i; printf( digite uma string: ); gets(s); //encontra o primeiro espaço ou o fim da string for (i = 0; s[i] && s[i]!=' '; i++); p = &s[i]; printf(p); }

Ponteiros e vetores multidimensionais

Ponteiros e matrizes Acessar vetores multidimensionais (matrizes) é de forma semelhante a acessar vetores de uma só dimensão. [0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] [2][0] [2][1] [2][2] [2][3] [0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] [2][0] [2][1] [2][2] [2][3] 0 1 2 3 4 5 6 7 8 9 10 11

Ponteiros e matrizes 0 1 2 3 4 5 6 7 8 9 10 11 *(pt+1) -> vet[0][0] *(pt+2) -> vet[0][1] *(pt+3) -> vet[0][2] *(pt+4) -> vet[1][0] *(pt+5) -> vet[1][1] *(pt+6) -> vet[1][2] *(pt+7) -> vet[2][0]... [0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] [2][0] [2][1] [2][2] [2][3]

Ponteiros e matrizes Exercício: Declare na main() uma matriz 10x10 do tipo int Crie uma função que acrescente valores múltiplos de 10 em todas as posições da matriz utilizando ponteiros Crie uma função que exiba a matriz, utilizando ponteiros

Vetores de ponteiros

Vetores de ponteiros Podem existir vetores de ponteiros: A declaração para uma matriz de ponteiros, do tipo int, de tamanho 10 é: int *x[10]; Para atribuir o endereço de uma variável ponteiro chamada var ao terceiro elemento da matriz de ponteiros, você deve escrever: x[2] = &var; Para encontrar o valor de var, você deve escrever: *x[2];

Vetores de ponteiros Exercício: Crie um vetor de 10 posições do tipo int que será lido pelo teclado. Crie um vetor de 10 posições do tipo ponteiro que guardará em cada posição, um endereço do vetor anterior. Através do uso de vetores, imprima cada valor na tela

Ponteiros para ponteiros

Ponteiros para ponteiros no caso de um ponteiro normal, o valor de um ponteiro é o endereço da variável que contém o valor desejado. No caso de um ponteiro para um ponteiro, o primeiro ponteiro contém o endereço do segundo ponteiro que aponta para uma variável com o valor desejado:

Ponteiros para ponteiros Uma variável que é um ponteiro para um ponteiro deve ser declarada como tal. Isso é feito colocando-se um asterisco adicional na frente do seu nome. Por exemplo, esta declaração diz ao compilador que novobalanço é um ponteiro para um ponteiro do tipo float: float **novobalanço;

Ponteiros para ponteiros Para acessar o valor desejado apontado indiretamente por um ponteiro para um ponteiro usa-se duas vezes o * #include <stdio.h> void main(){ int x, *p, **q; x = 10; p = &x; q = &p; printf( %d, **q); //imprime o valor de x }

Ponteiros para ponteiros Exercício: Crie um programa que tenha uma variável valor=5; Crie um ponteiro chamado pt1 que aponte para valor; Crie um ponteiro chamado pt2 que aponte para o ponteiro pt1; Crie um ponteiro chamado pt3 que aponte para o ponteiro pt2; Imprima e compare as diferenças entre: valor; &valor; &pt1; pt1; *pt1; &pt2; pt2; *pt2; **pt2; &pt3; pt3; *pt3; **pt3; ***pt3;