LPG - I: Ponteiros e Vetores/Matrizes UDESC - SBS

Slides:



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

Marco Antonio Montebello Júnior
Programação II Estruturas de Dados
Algoritmos e Estrutura de Dados I
Introdução à Computação - Jorge Macêdo
ICC – Matrizes Jorge Macêdo.
1 Tipos definidos O programador pode definir seus próprios tipos de dados tipos complexos usados da mesma forma que os simples declaram-se variáveis utilizando-se.
Linguagem C LPG-I – Variáveis Estruturadas – Vetores
LPG - I: Alocação Dinâmica de Memória - Ponteiros
AULA – Linguagem C – Vetores, Ponteiros Estruturas
UDESC - Prof. Juliano Maia
Ponteiros em C.
LPG-I: Tipos Complexos - Estruturas
Estruturas de Dados II Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Universidade de Brasília
LINGUAGEM C Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo.
Linguagem C Strings.
Slides Prof. Jean SIMÃO Revisão: Prof. João FABRO
Estruturas de Dados Homogêneas Multidimensionais – Matrizes
Fundamentos de Programação 1
Ponteiros.
VETORES, STRINGS E MATRIZES
Variável Variável: “objecto” que pode assumir diversos valores;
Escola Secundária c/ 3º CEB da Batalha
1MF. Vectores Tipo de dado usado para representar um CONJUNTO de dados do um mesmo tipo Estrutura de dados homogénea unidimensional Ex: Ler a nota de 3.
Escola Secundária c/ 3º CEB da Batalha
Listas Encadeadas.
Revisão da Linguagem C.
Apontadores ou Ponteiros
O Portal do Estudante de Computação
APRESENTAÇÃO: GIANCARLO DE GUSMÃO GONÇALVES CURSO DE C AULA 08: Tipos Estruturados.
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
Definição de Tipos Estruturas e Ponteiros
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
PROGRAMAÇÃO I PONTEIROS.
Seminário 1: Revisão de C
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
Linguagem C : Ponteiros
Vetores e Matrizes Ameliara Freire
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Algumas notas sobre a linguagem de programação C
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.
CES-10 INTRODUÇÃO À COMPUTAÇÃO
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 II – PARTE 6 Profa. Maria Augusta Constante Puget.
Ponteiros em C Prof. Kariston Pereira
Linguaguem de Programação II
Estruturas Homogêneas – Vetores e Matrizes
Algoritmo e Estrutura de Dados I Aulas 15 – Linguagem C Alocação Dinâmica de Memória Márcia Marra
Linguagem de Programação
Fundamentos de Programação 1
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.
Prof. Tertuliano Operadores Variáveis em C++.
FUNÇÕES Dilvan Moreira (baseado em material de Z. Liang)
Transcrição da apresentação:

LPG - I: Ponteiros e Vetores/Matrizes UDESC - SBS Departamento de Sistemas de Informação LPG - I: Ponteiros e Vetores/Matrizes Prof. Flavio Marcello Strelow flavio@sbs.udesc.br Linguagem C Flavio M. Strelow

Ponteiros ponteiro é uma variável que contém o endereço de um dados, normalmente uma outra variável. Daí o nome, pois ele aponta para outra variável. Ex: quando você anota o endereço de sua casa, você cria um ponteiro para ela. declaração: "*" indica que a variável é um ponteiro sintaxe: tipo_dado *nome_ponteiro; Ex: int x; /*variável declarada como inteiro int *pi; /* compilador sabe que pi é ponteiro */ /* pi é um ponteiro para inteiro */ Linguagem C Flavio M. Strelow

Ponteiros espaço ocupado pelas variáveis 2 bytes 4 bytes 1 byte Linguagem C Flavio M. Strelow

Ponteiros o operador "&" quando aplicado sobre uma variável retorna o seu endereço Ex: #include <stdio.h> void main (){ int x = 10, *pi; pi = &x; printf("&x: %p pi: %p", &x, pi); } R: => &x: 19BC pi: 19BC Obs.: Os valores apresentados são endereços de mémoria. Linguagem C Flavio M. Strelow

Ponteiros funcionamento de um ponteiro na memória Ex: void main () { int var; int *ptr; var = 10; ptr = &var; } Linguagem C Flavio M. Strelow

Ponteiros A Fig 1 dá uma noção gráfica do funcionamento de ponteiros. E está considerando que o endereçamento do sistema é dado por 2 bytes. Assim ptr ocupará 2 bytes; var também 2 bytes, por ser uma variável int. O número 4052 da posição de memória do primeiro byte de var é apenas ilustrativo e, na prática, dependerá do local da memória onde o programa foi carregado. Mas supomos que seja este. Portanto, após a execução de ptr = &var; o conteúdo de ptr será 4052, ou seja, o primeiro byte da variável apontada. Com ptr apontando para var, podemos ler ou modificar o valor desta última de forma indireta através de ptr. Linguagem C Flavio M. Strelow

Ponteiros o operador "*" quando aplicado sobre um ponteiro em uma expressão aritmética retorna o dado apontado Ex: void main () { int *tmp_ptr; int x, y; x = 10; tmp_ptr = &x; // tmp_ptra ponta para x y = *tmp_ptr; // conteúdo tmp_ptr = 10; portanto, y = 10. } Linguagem C Flavio M. Strelow

Ponteiros Ex.2: void main () { int x, *px; float y, *py; double largura, *altura; x=1; px = &x; /* px aponta para x */ *px = 0; /* conteúdo de px = 0 (x=0) */ x = *px + 1; /* x = conteúdo de px + 1 */ } Linguagem C Flavio M. Strelow

(int *) ≠ (float *) ≠ (char *) Ponteiros ponteiros são variáveis tipadas: possuem tipos diferentes para guardar endereços diferentes. Então um ponteiro para um tipo de dado int possui representação diferente de um ponteiro para tipo de dado float. (int *) ≠ (float *) ≠ (char *) Ex: main() { int *ip, x; float *fp, z; ip = &x; /* OK */ fp = &z; /* OK */ ip = &z; /* erro */ fp = &x; /* erro */ } Linguagem C Flavio M. Strelow

Utilizando Ponteiros modificando valores de variáveis de forma indireta através de ponteiros. Ex: #include <stdio.h> void main() { int x = 10; int *pi; pi = &x; /* pi aponta para endereço de x  *pi == 10 */ (*pi)++; /* conteúdo de pi + 1  *pi == 11 */ printf("%d", x); } R: ==> 11 ao alterar *pi estamos alterando o conteúdo de x Linguagem C Flavio M. Strelow

Utilizando Ponteiros Ex: } #include <stdio.h> void main() { int x = 10; int *pi, *pj; pi = &x; /* *pi = 10 */ pj = pi; /* *pj = 10 */ (*pi)++; /* conteúdo de pi + 1 (*pi, *pj, x) = 11 */ (*pj)++; /* conteúdo de pj + 1 (*pi, *pj, x) = 12 */ printf("%d", x); /* ==> 12 */ } Linguagem C Flavio M. Strelow

Exercício 1 Pratique a declaração e utilização de ponteiros. defina e inicialize uma variável inteira defina um ponteiro para inteiro modifique o valor da variável através do ponteiro verifique os novos valores da variável usando printf Linguagem C Flavio M. Strelow

Vetores e Ponteiros ponteiros oferecem um eficiente e prático meio de acesso e manipulação dos elementos de uma array. EX.: void main () { int ar[] = {10, 50, 20, 30}; int *ptr; ptr = &ar[0]; // ou ptr = ar; } Quando for executado, ptr estará associado ao primeiro byte da array conforme Fig 2. Linguagem C Flavio M. Strelow

Vetores e Ponteiros Ex: em float m[10] m é uma constante que endereça o primeiro elemento do vetor portanto, não é possível mudar o valor de m Ex: void main ( ) { float m[10], n[10]; float *pf; m = n; //erro: m é constante! pf = m; //ok } Linguagem C Flavio M. Strelow

Referenciando Elementos pode-se referenciar os elementos do vetor através do seu nome e o índice entre os colchetes: Ex: #include <stdio.h> void main () { m[5] = 5.5; if (m[5] == 5.5) printf("Exito"); else printf("Falha"); } Linguagem C Flavio M. Strelow

Referenciando Elementos Pode-se referenciar os elementos de um vetor através de ponteiros: Ex: #include <stdio.h> void main () { float m[] = { 1.0, 3.0, 5.75, 2.345 }; float *pf; pf = &m[2]; printf("%f", *pf); /* ==> 5.75 */ } Linguagem C Flavio M. Strelow

Referenciando Elementos Pode-se utilizar ponteiros e colchetes: Ex.: #include <stdio.h> void main () { float m[] = { 1.0, 3.0, 5.75, 2.345 }; float *pf; pf = &m[2]; printf("%f", pf[0]); /* ==> 5.75 */ } Note que o valor entre colchetes é o deslocamento a ser considerado a partir do endereço de referência: pf[n] => indica enésimo elemento a partir de pf Linguagem C Flavio M. Strelow

Vetores - Aritmética de Ponteiros É possível fazer operações aritméticas e relacionais entre ponteiros e inteiros Soma: ao somar-se um inteiro n a um ponteiro, endereçamos n elementos a mais (n positivo) ou a menos (n negativo) pf[2] equivale a *(pf+2) *(pf + n) endereça n elementos a frente *(pf - n) endereça n elementos atrás pf++ endereça próximo elemento vetor pf-- endereça elemento anterior vetor Linguagem C Flavio M. Strelow

Exemplo #include <stdio.h> void main () { int arint[] = { 1,2,3,4,5,6,7 }; int size = 7; /* tamanho do vetor */ int i, *pi; for (pi=arint, i=0; i < size; i++, pi++) printf(" %d ", *pi); } R: ==> 1 2 3 4 5 6 7 Linguagem C Flavio M. Strelow

Exemplo - Variação #include <stdio.h> void main () { int arint[] = { 1,2,3,4,5,6,7 }; int size = 7; /* tamanho do vetor */ int i, *pi; for (pi=arint, i=0; i < size; i++) printf(" %d ", *pi++); } R: ==> 1 2 3 4 5 6 7 Linguagem C Flavio M. Strelow

Exemplo - Variação #include <stdio.h> void main () { int arint[] = { 1,2,3,4,5,6,7 }; int size = 7; /* tamanho do vetor */ int i, *pi; pi = arint; printf(" %d ", *pi); pi += 2; printf(" %d ", *pi); } R: ==> 1 3 5 7 Linguagem C Flavio M. Strelow

Operações Válidas Sobre Ponteiros É valido: somar ou subtrair um inteiro a um ponteiro (pi ± int) incrementar ou decrementar ponteiros (pi++, pi--) subtrair ponteiros (produz um inteiro) (pf - pi) comparar ponteiros ( >, >=, <, <=, == ) Não é válido: somar ponteiros (pi + pf) multiplicar ou dividir ponteiros (pi*pf, pi/pf) operar ponteiros com double ou float (pi ± 2.0) Linguagem C Flavio M. Strelow

Exercício 2 Escreva um programa que imprima um vetor de inteiros na ordem inversa endereçando os elementos com um ponteiro Linguagem C Flavio M. Strelow

Cuidados... C não controla os limites dos vetores, o programador deve fazê-lo Ex: encontre o erro!! #include <stdio.h> void main () { int arint[] = { 1,2,3,4,5,6,7 }; int size = 7, i, *pi; for (pi=arint, i=0; i < size; i++, pi += 2) printf(" %d ", *pi); } Linguagem C Flavio M. Strelow

Cuidados... void main () { int arint[] = { 1,2,3,4,5,6,7 }; int size = 10; int i; for (pi=arint, i=0; i < size; i++) printf(" %d ", arint[i]); } Linguagem C Flavio M. Strelow

Cuidados... Um ponteiro deve sempre apontar para um local válido antes de ser utilizado Ex: #include <stdio.h> void main () { int i=10, *pi; *pi = i; /*erro ! pi nao tem endereco valido*/ } Linguagem C Flavio M. Strelow

Ponteiros Genéricos Um ponteiro genérico é um ponteiro que pode apontar para qualquer tipo de dado Define-se um ponteiro genérico utilizando-se o tipo void: #include <stdio.h> void main (){ void *pv; nt x=10; float f=3.5; pv = &x; /* aqui pv aponta para um inteiro */ pv = &f; /* aqui, para um float */ } Linguagem C Flavio M. Strelow

Ponteiros Genéricos O tipo de dado apontado por um void pointer deve ser controlado pelo usuário Usando um type cast (conversão de tipo) o programa pode tratar adequadamente o ponteiro #include <stdio.h> void main (){ void *pv; pv = &x; printf("Inteiro: %d\n", *(int *)pv); /*=> 10*/ pv = &f; printf("Real: %f\n", *(float *)pv); /*=> 3.5*/ } type cast Linguagem C Flavio M. Strelow

Ponteiros e Strings strings são vetores de caracteres e podem ser acessados através de char * EX.: void main () { char str[]="abcdef", *pc; for (pc = str; *pc != ‘\0’; pc++ ) putchar(*pc); } R: ==> abcdef o incremento de pc o posiciona sobre o próximo caracter (byte a byte) Linguagem C Flavio M. Strelow

Ponteiros e Strings operações sobre strings com ponteiros Ex.: void StrCpy (char *destino, char *origem) { // *origem==0 encerra while while (*origem) { *destino=*origem; origem++; destino++; } *destino='\0'; } // na condição do while (*origem) e (*origem != ‘\0’) são equivalentes origem a b c d e \0 a b destino Linguagem C Flavio M. Strelow

Ponteiros e Strings variação de strcpy: void strcpy (char *destino, char *origem) { while ((*destino = *origem) != ‘\0’) destino++, origem++; } *destino='\0'; Linguagem C Flavio M. Strelow

Vetores Multidimensionais vetores podem ter diversas dimensões, cada uma identificada por um par de colchetes na declaração Ex.: char matriz[5][10]; declara uma matriz de 5 linhas e 10 colunas: na memória, entretanto, os caracteres são armazenados linearmente: [0,0] [4,9] [0,0] [0,9] [1,9] [4,9] Linguagem C Flavio M. Strelow

Vetor de Caracteres Percorrendo vetor com ponteiro: #include <stdio.h> #define L 5 #define C 10 void main () { char matriz[L][C]; char *pc; int i; for (i=0, pc=matriz[0]; i < (L * C) ; i++, pc++) *pc = 'P'; printf("%c", *pc); } Linguagem C Flavio M. Strelow

Vetor de Caracteres Percorrendo vetor com índices: #include <stdio.h> #define L 5 #define C 10 void main () { char matriz[L][C]; int i, j; for (i=0, j=0; i<L; i++) for (j=0; j<C; j++) matriz[i][j] = 'P'; printf("%c", matriz[i][j]); } //as colunas (dimensões mais a direita) mudam mais rápido Linguagem C Flavio M. Strelow

Vetor de Strings Neste caso, cada elemento do vetor é um ponteiro para um caracter Declaração: char *arstr[] = {"Joao", "Maria", "Antonio", "Zacarias", "Carlos"}; arstr é um vetor de ponteiros para char, iniciado com os strings indicados Linguagem C Flavio M. Strelow

Vetor de Strings Comparando vetor de string com matriz de char char *as[]={"Joao","Maria","Antonio","Zacarias","Carlos"}; char ma[5][10]= {"Joao","Maria","Antonio","Zacarias","Carlos"}; Ponteiros (as) Matriz (ma) J o a o M a r i a A n t o n i o Z a c a r i a s C a r l o s \0 “Joao” “Maria” “Antonio” “Zacarias” “Carlos” Linguagem C Flavio M. Strelow

Cuidados com Strings É comum esquecer de alocar uma área para armazenamento de caracteres void main() { char *pc; char str[] = "Uma string"; strcpy(pc, str); /* erro! pc indeterminado */ ... } Linguagem C Flavio M. Strelow

Ponteiros para Ponteiros É possível definir ponteiros para ponteiros até um nível arbitrário de indireção Ex: #include <stdio.h> void main () { char *pc; /* ponteiro para char */ char **ppc; /* ponteiro para ponteiro para char */ pc = "teste"; ppc = &pc; putchar(**ppc); /* ==> ‘t’ */ } Linguagem C Flavio M. Strelow

Exemplo:Troca Variáveis - Ponteiros #include <stdio.h> void troca(int *, int *); int main(void){ int x, y; x = 3; y = 4; printf("main - x = %d, y=%d \n", x, y); troca(&x, &y); } void troca(int *x, int *y){ int z; printf("troca - x = %d, y=%d \n", *x, *y); z = *x; *x = *y; *y = z; Linguagem C Flavio M. Strelow

Exercício 3 - Ponteiros Escreva uma função que receba três números reais (float) e reordene-os de forma decrescente. Teste sua implementação. Sugestão para protótipo da função: void ordena(float *a, float *b, float *c); Linguagem C Flavio M. Strelow