Linguaguem de Programação II

Slides:



Advertisements
Apresentações semelhantes
Marco Antonio Montebello Júnior
Advertisements

Programação II Estruturas de Dados
Algoritmos e Estrutura de Dados I
ICC – Matrizes Jorge Macêdo.
Introdução a Programação
Alocação Dinâmica de Memória
LPG - I: Alocação Dinâmica de Memória - Ponteiros
AULA – Linguagem C – Vetores, Ponteiros Estruturas
LPG - I: Ponteiros e Vetores/Matrizes UDESC - SBS
Estruturas de Dados II Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Universidade Federal do Espírito Santo Programação II Vetores Professora: Norminda Luiza.
LINGUAGEM C Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo.
Linguagem C Strings.
Estruturas de Dados Homogêneas Unidimensionais – Vetores e Strings
Ponteiros em Linguagem C
Slides Prof. Jean SIMÃO Revisão: Prof. João FABRO
Linguagem C Strings.
Fundamentos de Programação 1
Ponteiros.
APRESENTAÇÃO: GIANCARLO DE GUSMÃO GONÇALVES CURSO DE C AULA 08: Tipos Estruturados.
O Portal do Estudante de Computaçã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
Linguagem de Programação II Parte IX
CADEIA DE CARACTERES (Strings)
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.
PROGRAMAÇÃO I PONTEIROS.
Aula prática 6 Vetores e Matrizes
Professor Mário Dantas
Prof. Ricardo Santos PONTEIROS
Curso de C/C++ Aula 2 Instrutor: Luiz Felipe Sotero
Computação Eletrônica
Linguagem C : Ponteiros
Vetor Prof. Guilherme Baião S. Silva Adaptações:
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
Aula P.02 – BCC202 Revisão sobre Ponteiros Túlio Toffolo
Estruturas de Dados Aula 7: Tipos Estruturados 23/04/2014.
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Estruturas de Dados Aula 6: Cadeias de Caracteres
STRINGS Dilvan Moreira (baseado no livro Big Java e Z. Liang)
Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
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 de Computadores I – Ponteiros Profa. Mercedes Gonzales Márquez.
Algoritmo e Estrutura de Dados I Aulas 12 – Linguagem C Strings Márcia Marra
Ponteiros em C Prof. Kariston Pereira
Estrutura de Dados Revisão Professor Luiz José Hoffmann Filho
Estruturas Homogêneas – Vetores e Matrizes
Linguaguem de Programação II
Profa. Maria Augusta Constante Puget
Algoritmo e Estrutura de Dados I Aulas 15 – Linguagem C Alocação Dinâmica de Memória Márcia Marra
Algoritmo e Estrutura de Dados I Aulas 14 – Linguagem C Matriz Márcia Marra
Linguagem de Programação
PCI- Vetores Profa. Mercedes Gonzales Márquez. Aula 5 - VetoresAlgoritmos e Estruturas de Dados I Sequência de valores todos do mesmo tipo Nome único.
ponteiros Estrutura de Dados Prof. André Cypriano M. Costa
Computação – Informática Aula N. 05 Prof. SIMÃO Jean Marcelo SIMÃO Linguagem C “Matrizes em C”
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.
Estrutura de Dados STRUCTS Dilvan Moreira. Objetivos  Entender o que são e como usar:  Estrutura de Dados para a Linguagem C  Structs (Registros)
Estruturas Homogêneas - Vetores
1 Aula 07 Strings Prof. Filipe Mutz. 2 Em nossos programas ainda não vimos como armazenar palavras e textos, e eles são muito importantes! Exemplos: Programas.
FUNÇÕES Dilvan Moreira (baseado em material de Z. Liang)
Estrutura de Dados Revisão
Transcrição da apresentação:

Linguaguem de Programação II Aula 5 Ponteiros Prof. Luiz José Hoffmann Filho ljhfilho@gmail.com

Ponteiros O que são ponteiros? Um ponteiro é uma variável que contém um endereço de memória. Esse endereço é normalmente a posição de uma outra variável na memória. Se uma variável contém o endereço de uma outra, então a primeira variável é dita para apontar para a segunda.

Ponteiros Endereço na memória Variável na memória 1000 1003 1001 1002 JOSE 1004 1005

Ponteiros Declaração: <tipo> *<nome da variável>; Exemplo: int *valor; char *nome;

Ponteiros Os operadores de Ponteiros: & - é um operador unário que devolve o endereço na memória do seu operando. Exemplo: m = &count; * - é o complemento de &. É um operador unário que devolve o valor da variável localizada no endereço que o segue. q = *m;

Ponteiros Atribuição de ponteiros: #include <stdio.h> int main() { int x; int *p1, *p2; x = 1000; p1 = &x; p2 = p1; printf("%p \n", p2); /*escreve o endereço de x, não seu valor*/ printf("%d \n", *p2); /* escreve o valor de x */ return 0; }

Ponteiros Aritmética de ponteiros: Comparação de ponteiros: int *p1; p1 = &x; /* supondo que a posição de x é igual a 2000 */ p1++; /* incrementando em uma posição, agora vale 2001*/ P1--; /* decrementando em uma posição, agora vale 2000*/ P1 = p1 +10; /* Soma de posições, agora vale 2010*/ Comparação de ponteiros: If (p<q) printf(“p aponta para uma memória mais baixa que q”); If (p == q) printf(“p aponta para a memória mesma que q”);

Exercícios Explique a diferença entre: O que quer dizer *(p+10);? Explique o que você entendeu da comparação entre ponteiros.

Exercícios Qual o valor de y no final do programa? Tente primeiro descobrir e depois verifique no computaadore o resultado. A seguir, escreva um /*comentário */ em cada comando de atribuição explicando o que ele faz e o valor da variável à esquerda do ‘=’ após sua execução. int main() { int y, *p, x; y=0; p = &y; x = *p; x = 4; (*p)++; x--; (*p) += x; printf(“y = %d \n”, y); return(0); }

Ponteiros Ponteiros e Matrizes: char str[80], *p1; p1 = str; p1 foi inicializado com o endereço de primeiro elemento da matriz str. Para acessar o quinto elemento de str: str[4]; *(p1+4); Vetor/Matriz de Ponteiros: int *x[10]; x[2] = &var; Atribuir o endereço a variável var a uma posição do vetor *x[2]; Valor de var.

Ponteiros – Vetores/Matriz Programa para zerar uma matriz: int main() { float matrx[50][50]; int i, j; for (i=0; i<50; i++) { for(j=0;j<50; j++) { matrx[i][j] =0.0; } return(0); Agora faça utilizando ponteiros?

Ponteiros – Vetores/Matriz Programa para zerar um matriz usando ponteiros: int main() { float matrx[50][50]; int i; float *p; p = matrx[0]; for (i=0; i<2500; i++) { *p=0.0; p++; } return(0);

Ponteiros – vetor/matriz Existe uma diferença entre o nome de um vetor e um ponteiro que deve ser frisada: um ponteiro é uma variável , mas o nome de um vetor não é uma variável. Isto significa que não se consegue alterar o endereço que é apontando pelo “nome do vetor”. int vetor[10]; int *p, i; p = &i; /* operações invalidas */ vetor = vetor + 2; vetor++; vetor = ponteiro; /* operações validas */ ponteiro = vetor; ponteiro = vetor + 2;

Ponteiros – Strings Seguindo o raciocínio, nomes de strings, são do tipo char*. Isto nos permite escrever a nossa função StrCpy(), que funcionará de forma semelhante à função strcpy() da biblioteca: #include <stdio.h> #include <stdlib.h> void StrCpy(char *destino, char *origem) { while(*origem) { *destino = *origem; origem++; destino++; } *destino = '\0'; int main() { char str1[100], str2[100], str3[100]; printf("Entre com um string: "); scanf("%s", str1); StrCpy(str2, str1); StrCpy(str3, "Voce digitou a String "); printf("\n\n %s%s", str3, str2); return (0);

Ponteiros Vetor de ponteiros: int *pmatrx[10]; É um vetor que armazena 10 ponteiros para inteiros.

Exercícios – Ponteiros + vetores Fizemos a função StrCpy(). Faça a função StrLen() e StrCat() que funcionem como a função strlen() e strcat() de string.h respectivamente.

Ponteiros Indireção mútipla: Inicialização de ponteiros: int main() { int x, *p, **q; x = 10; p = &x; q = &p; printf(“%d”, **q); return 0; } Inicialização de ponteiros: int *p = NULL; char *p = “alo mundo”;

Exercício – Intereção múltiplas Verifique o programa abaixo. Encontre o seu erro e corrija-o para que escreva o número 10 na tela. int main() { int x, *p, **q; p = &x; q = &p; X = 10; printf(“%d”, &q); return 0; }

Inicialização de ponteiros Grande problema, quando não inicializamos um ponteiro, ele provavelmente irá apontar para “lixo”; Sempre inicializar um ponteiro com “NULL” ou algum valor válido.

Inicialização de ponteiros #include <stdio.h> #include <string.h> int main() { char *p = "Alo mundo"; int i; printf("%s\n", p); for (i = strlen(p) -1; i > -1;i--) { printf( "%c ", p[i]); } printf("\n"); return;

Ponteiros Alocação dinâmica: stdlib.h Malloc = aloca memória int *p; If (!(p=malloc(50*sizeof(int)) { Printf(“sem memória.\n”); Return 0; } Free = desaloca memória free(p);

Ponteiros – Alocação de matriz #include <stdio.h> #include <string.h> int main() { char *s; int t; s = malloc(80); if (!s) return 0; scanf("%s",s); for ( t = strlen(s) - 1; t >= 0; t--) printf("%c", s[t]); free(s); }

Exemplo Como exemplo de uso destas funções considere o problema de reservar n posições para armazenar variáveis do tipo int. Para isto usamos o trecho de programa mostrado em 5. Observe que após alocar o espaço foi usada a notação de vetores comuns. #include < stdlib .h > #include < stdio .h > int main (void) { int i , n , * pvetor ; float media ; /* Define um valor para n , scanf ou n = */ scanf ( " % d " , & n ); /* aloca espaco na memoria */ pvetor = (int *) malloc ( n * s i z e o f(int)); i f (! pvetor ) { puts ( " Sem memória . " ); return 1; } /* A PARTIR DE AGORA VOLTAMOS PARA VETORES COMUNS */ /* aqui uso pvetor , vamos ler um vetor */ for (i = 0; i < n ; i ++) { scanf ( " % d " , &pvetor[ i ]); /* faco alguma coisa */ media = 0.0; media += pvetor [ i ]; printf ( " % f \ n " , media ); /* aqui nao preciso mais de pvetor */ free ( pvetor ); return 0;

Problemas com ponteiros 1 int main () { int x, *p; x = 10; *p = x; } Ele atribui o valor 10 a alguma posição de memória desconhecida. O ponteio p nunca recebeu um valor. Como seria a forma correta? p = &x;

Problemas com ponteiros 2 int main () { int x, *p; x = 10; p = x; printf(“%d\n”, *p); } Printf não imprime o valor de x, que é 10, na tela. Imprimi algum valor desconhecido por que a atribuição “p = x” esta incorreta. A forma correta é: “p = &x”

Problema com ponteiros 3 char s[80], y[80]; char *p1, *p2; p1 = s; p2 = y; If (p1<p2) …. Problema fazer uma “suposição” que os vetores são contiguos. Fazer comparação entre ponteiros que não apontam para um objeto comum produz resultados inesperados.

Problema com ponteiros 4 int first[10], second[10]; int *p, t; p = first; for(t=0;t<20; t++) *p++ =t; Achar que dois vetores diferentes são adjacentes na memória.

Problema com ponteiros 5 int main() { char *p1, s[80]; p1 = s; do { gets(s); while(*p1) printf(“ %d”,*p1++); } while (strcmp(s, “done”)); return; } Qual o problema aqui? Como posso resolver este problema?

Problema com ponteiros 5 int main() { char *p1, s[80]; do { p1 = s; gets(s); while(*p1) printf(“ %d”,*p1++); } while (strcmp(s, “done”)); return; }

Exercícios Escreva um programa que declare uma matriz 100x100 de inteiros. Você deve inicializar a matriz com zeros usando ponteiros para endereçar seus elementos. Preencha depois a matriz com os números de 1 a 10000, também usando ponteiros.

Bibliografia Schildt, Herbet. C Completo e Total, 3ª ed. São Paulo. Markron Books, 1996.