LINGUAGEM C Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo.

Slides:



Advertisements
Apresentações semelhantes
C/C++ para Sistemas Operacionais Professor: André Luis Meneses Silva /msn: Página:
Advertisements

Laboratório de programação III Linguagem C
Algoritmo e Programação
Construção de Algoritmos AULA 07
Construção de Algoritmos Professor: Aquiles Burlamaqui Construção de Algoritmos AULA 07 Aquiles Burlamaqui UERN
Programação II Estruturas de Dados
Programação II Estruturas de Dados
Programação para Engenharia I
Algoritmos e Estrutura de Dados I
Ponteiros em C.
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 Estruturas Professora: Norminda Luiza.
PROGRAMAÇÃO ou LINGUAGEM C?
LINGUAGEM C Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo.
LINGUAGEM C Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo.
PROGRAMAÇÃO ou LINGUAGEM C?
LINGUAGEM C Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo.
Curso de C/C++ Avançado
Ponteiros em Linguagem C
Fundamentos de Programação 1
Ponteiros.
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
2002/2003 Programação Orientada para Objectos 1 Aula 4 Memória, unidade básica de memória e conceito de endereço Ponteiros Relação de ponteiros com matrizes.
Revisão da Linguagem C.
Apontadores ou Ponteiros
APRESENTAÇÃO: GIANCARLO DE GUSMÃO GONÇALVES CURSO DE C AULA 08: Tipos Estruturados.
INTRODUÇÃ A COMPUTAÇÃO ENG. CIVIL
Introdução a Computação e Cálculo Numérico
Ponteiros Variáveis do tipo “ponteiro” armazenam endereços de memória
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.
Curso de Nivelamento LCG
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
Construção de Algoritmos Professor: Aquiles Burlamaqui Construção de Algoritmos AULA 07 Aquiles Burlamaqui UERN
Construção de Algoritmos Professor: Aquiles Burlamaqui Construção de Algoritmos AULA 05 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.
PROGRAMAÇÃO ou LINGUAGEM C?
LINGUAGEM C Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo.
UNIDADE 5 ESTRUTURAS DE DADOS HOMOGÊNEAS
PROGRAMAÇÃO PROCEDIMENTAL
Professor Mário Dantas
Prof. Ricardo Santos PONTEIROS
Curso de C/C++ Aula 2 Instrutor: Luiz Felipe Sotero
Linguagem C : Ponteiros
Técnicas de Desenvolvimento de Programas
Algoritmos e Estruturas de Dados I – Ponteiros
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
PROGRAMAÇÃO ou LINGUAGEM C?
Algumas notas sobre a linguagem de programação C
Algoritmos e Estrutura de Dados I Jean Carlo Mendes
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
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 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 9: Meu primeiro programa em C
Ponteiros em C Prof. Kariston Pereira
Linguaguem de Programação II
Estrutura de Dados Revisão Professor Luiz José Hoffmann Filho
Linguagem de Programação
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 Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo

Tópicos 1. Introdução à Linguagem C 2. Operadores e Expressões 3. Estruturas de Controle 4. Entrada e Saída 5. Matrizes e strings 6. Funções 7. Ponteiros 8. Estruturas e Uniões 9. Arquivos Texto 10. Arquivos Binários

Ponteiros O que são Razões de uso dos ponteiros: 1) fornecem maneiras pelas quais podemos mudar argumentos de funções; 2) rotinas de alocação dinâmica; 3) substituição por matrizes Perigos: uso de ponteiros não inicializados ou perdidos e facilidade para seu uso incorretamente O que são Ponteiros são variáveis que contêm um endereço de memória - “uma variável aponta para a outra” Sintaxe: tipo *nome_var; Note que o tipo diz o tipo de variável que o ponteiro pode apontar

Endereço de memória Variável na memória Exemplos: char *p; int *temp, *inicio; Endereço de memória Variável na memória Operadores de ponteiros & - end. de memória do operando * - conteúdo Ex.: end_cont = &cont; leia-se “end_cont recebe o endereço de cont” val = *end_cont; leia-se “val recebe o valor do endereço end_cont”

Exemplo ponteiro imprime Ex.: val = *end_cont; leia-se “val recebe o valor do endereço end_cont” Exemplo ponteiro imprime main() { int *end_cont, cont, val; cont = 100; end_cont = &cont; val = *end_cont; printf (“%d”,val); } Uso do tipo: Atribuimos valores indiretos, mas como sabemos que o compilador transfere o número adequado de bytes para qualquer atribuição que use ponteiro? Você deve assegurar que suas variáveis com ponteiros sempre apontem para o tipo correto de dados

Exemplo apontador tipo errado main() { float x = 10.1, y; int *p; p = &x; y = *p; printf(“%f”,y); } Expressões com ponteiros Atribuições com ponteiros Exemplo atribuição de ponteiros main() { int x; int *p1, *p2; p1 = &x; p2 = p1; printf (“ %p”,p2); } %p mostra endereço de ponteiro

Supondo ocuparem o endereço 3000: ch 3000 i ch+1 3001 ch+2 3002 i+1 Aritmética de ponteiros: uso das operações + e - Supondo p1 ponteiro para inteiro com valor 2000: p1++; faz com que p1 seja 2002 se fosse p1--; faria com que p1 tivesse o valor 1998 A aritmética de ponteiros funciona para tipos base diferentes char *ch; int *i; Supondo ocuparem o endereço 3000: ch 3000 i ch+1 3001 ch+2 3002 i+1 ch+3 3003 ch+4 3004 i+2 Massa! Você também pode adicionar ou subtrair valores inteiros a ponteiros. Veja o efeito: p1 = p1 + 9 /*p1 apontará para o nono elemento do seu tipo base */

Exemplo relacionamento entre ponteiros e matrizes Comparações de ponteiros: if (p<q) printf (“p aponta para uma posição inferior\n”); Uso: quando 2 ponteiro apontam para um mesmo objeto Exemplo de dump: os ponteiros podem ser usados para o exame do conteúdo de memória Ponteiros e matrizes No programa abaixo entenda que o nome de uma matriz sem índice é o endereço do início da matriz Exemplo relacionamento entre ponteiros e matrizes char str[80], *p; char *p1; p1 = str; posso colocar str[4] ou *(p1+4); A aritmética de ponteiros pode ser mais rápida do que a indexação de matrizes!!!

Exemplo indexação com matrizes main() { char str[80]; int i; printf(“digite uma string em minúsculas: “); gets (str); printf (“transformei para: ); for (i=0;str[i];i++) printf (“%c”,tolower(str[i]); } Exemplo acesso com ponteiros main() { char str[80], *p; printf(“digite uma string em minúsculas: “); gets (str); printf (“transformei para: ); p = str; while (*p) printf (“%c”,tolower(*p++)) } Acesso aleatório é melhor a indexação

Exemplo indexação de ponteiros Indexando um ponteiro - pode se indexar um ponteiro como se ele fosse uma matriz Exemplo indexação de ponteiros main() { int i[5]={1,2,3,4,5} int *p, t; p = i; for (t=0;t<5;t++) printf(“%d”,p[t]); } Em C, o comando p[t] é o mesmo que *(p+t) Exemplo de pilha: uma pilha é uma lista “primeiro a entrar é o último a sair” é usada uma rotina para colocar valores na pilha (push) e também para tirá-los (pop) é preciso conter um endereço de início de pilha (tos)

Exemplo pilha int pilha[50]; int *p1, *tos; main() { int valor; p1 = pilha; tos = p1; do { scanf (“%d”,&valor); if (valor != 0) push (valor); else printf (“aqui esta %d\n”, pop()); } while (valor != 0); } push(i) int i; p1++; if (p1 == (tos+50)) { printf estouro”); exit(); *p1 = i; pop() { if (p1 == (tos)) { printf (“estouro”); exit(); } p1--; return *(p1+1);

Exemplo passagem de parâmetros Ponteiros e strings: na passagem de parâmetros o computador passa um ponteiro para strings e não o valor da string Exemplo passagem de parâmetros strcmp() char *s1, *s2; { while (*s1) if (*s1-*s2) return *s1-*s2; else { s1++; s2++; } return ‘\0’; Mas e quando eu passo uma constante de uma string como parâmetro?

Exemplo constante de string O computador trata a constante como se ela fosse um ponteiro para o primeiro caractere da string Exemplo constante de string main() { char *s; s = “oi, tudo bem?” printf(s); } Obter o endereço do elemento de uma matriz p = &x[2]; - útil na localização de substring Exemplo substring main() { char s[80], *p; int i; gets(s); for (i=0;s[i] && s[i] != ‘ ‘;i++); p = &s[i]; printf(p); }

Exemplo mensagens de erros Matrizes de ponteiros: feita como com qualquer outro tipo. Exemplo: int *x[10]; Atribuir o endereço de uma variável inteira ao terceiro elemento: x[2] = &var; Achar o valor de var: *x[2] Uso comum: mensagem de erros Exemplo mensagens de erros char *err[]= { “não pode abrir arquivo\n”, “erro de leitura\n”, “erro de escrita\n”, “falha de dispositivo\n” }; serro(num) int num; { printf (“%s”,err[num]); }

Ponteiros para ponteiros Matriz de ponteiros é o mesmo que ponteiros para ponteiros, o seu conceito é direto, mas o de ponteiros para ponteiros é mais complicado ponteiro (endereço) variável (valor) ponteiro (endereço) ponteiro (endereço) variável (valor) Declarando uma variável que é um ponteiro para um ponteiro. Ex.: float **novo; Exemplo ponteiro de ponteiro main() { int s, *p, **q; x = 10; p = &x; q = &p; printf (“%d”,**p); }

Exemplo ponteiro nulo Exemplo uso de string Inicialização de ponteiros: se um ponteiro é declarado e não há uma atribuição, ele tem um valor desconhecido Ponteiro que não aponta para lugar algum deve ser dado um valor nulo Mas a segurança não é total Ponteiro nulo pode tornar as rotinas mais eficientes Exemplo ponteiro nulo for (t=0;p[t];++t) if (!strcmp(p[t],nome)) break; É comum inicializar strings com ponteiros. Ex.: char *p = “alo mundo\n”; - tabela de strings Exemplo uso de string char *p = “alo mundo”; main() { register int t; print(p); for (t=strlen(p)-1;t>-1;t--) printf(“%c”,p[t]); }

Exemplo erro ponteiro não inicializado Problemas com ponteiros “ponteiros perdidos” o problema em si não é o ponteiro lendo / gravando em posições desconhecidas Há alguns erros que são comuns: Exemplo erro ponteiro não inicializado main() { int x, *p; x = 10; *p = x; } Exemplo erro ponteiro interpretação main() { int x, *p; x = 10; p = x; printf (“%d”,*p); }

Alocação dinâmica de memória Existem 2 métodos através dos quais um programa em C pode armazenar informações na memória principal 1 - através de variáveis locais e globais 2 - através de funções de alocação dinâmica de memória: malloc() e free() - nesse método o programa aloca armazenamento para informações da área de memória livre (heap) Pilha ______ Memória livre para alocação ________________________ Variáveis globais _________________________ Programa

Função malloc() - aloca uma parte do restante de memória livre, serve para alocação de memória com finalidades gerais. Sintaxe: void *malloc (int número_de_bytes) retorna um ponteiro do tipo void que significa que deve ser usado um tipo cast quando atribuir o ponteiro devolvido por malloc() a um ponteiro desejado malloc() devolve um ponteiro para o primeiro byte da região de memória que foi alocada na área de alocação dinâmica se não houver memória suficiente, malloc devolve um tipo nulo pode usar sizeof Função free() - devolve ao sistema memória previamente alocada. Sintaxe: free (void *p); free nunca deve ser chamado com um argumento inválido, pois será destruída a lista livre

Exemplo uso de alocação dinâmica main() { int *p, t; p = (int *)malloc(40*sizeof(int)); if (!p) printf (“memória insuficientes\n”); else { for (t=0;t<40;++t) *(p+t)=t; for (t=0;t<40;++t) printf(“%d “,*(p+t)); } Lembre-se: antes de usar o ponteiro que malloc devolve, assegura-se que o pedido foi bem sucedido testando o valor devolvido!!!!!