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

4 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”

5 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

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 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 i ch ch i+1 ch ch 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 */

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

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

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

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

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

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

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

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

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