A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "LINGUAGEM C Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo."— Transcrição da apresentação:

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

2 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

3 Ponteiros –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

4 –Exemplos:char *p; int *temp, *inicio; Endereço de memóriaVariá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

5 –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

6 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

7 –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 */ char *ch; int *i; Supondo ocuparem o endereço 3000: ch3000i ch ch+23002i+1 ch ch+43004i+2 –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

8 –Comparações de ponteiros: if (p

9 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

10 –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)

11 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); }

12 –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?

13 –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); }

14 –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]); }

15 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); }

16 –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]); }

17 –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); }

18 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 Pilha ______ Memória livre para alocação ________________________ Variáveis globais _________________________ Programa

19 –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

20 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!!!!!


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

Apresentações semelhantes


Anúncios Google