Escolar Documentos
Profissional Documentos
Cultura Documentos
Ponteiros
Fernando S. Pacheco
INSTITUTO FEDERAL DE EDUCAO, CINCIA E TECNOLOGIA DE SANTA CATARINA
CAMPUS FLORIANPOLIS
DEPARTAMENTO ACADMICO DE ELETRNICA
ProgC - Ponteiros 2
Sumrio
Ponteiros
Recapitulando variveis
Aplicaes
Operadores e inicializao
Argumento de funes
Aritmtica de ponteiros
Exemplos e cuidados
Ponteiros const
ProgC - Ponteiros 3
Ponteiros
Conceito importantssimo em C
Recapitulando variveis em C
Quando se declara
char k;
Observe o problema
ProgC - Ponteiros 25
Inicializao de ponteiros
#include <stdio.h>
int main()
{
int val = 7;
int *ptr;
printf("Valor de val: %d\n", val);
printf("Endereo apontado por ptr: %p\n", ptr);
printf("Valor apontado por ptr: %d\n", *ptr);
/*observe que aqui haver lixo, que poderia
ser usado e traria consequncias desastrosas*/
return(0);
}
ProgC - Ponteiros 26
Inicializao de ponteiros
#include <stdio.h>
int main()
{
int val = 7;
int *ptr=NULL; /*apontar para o endereo NULL
(0), ir evitar que lixo seja usado, como no
exemplo anterior*/
printf("Valor de val: %d\n", val);
printf("Endereo apontado por ptr: %p\n", ptr);
printf("Valor apontado por ptr: %d\n", *ptr);
/*ir gerar um SEG FAULT (falha de
segmentao)*/
return(0);
}
ProgC - Ponteiros 27
Inicializao de ponteiros
/*Mais um exemplo de problema*/
#include <stdio.h>
int main()
{
int val = 7;
int *ptr;
*ptr = 5; //aqui ocorrer uma falha de
segmentao (SEG FAULT)
printf("Valor de val: %d\n", val);
printf("Valor apontado por ptr: %d\n", *ptr);
printf("Endereo apontado por ptr: %p\n", ptr);
return(0);
}
ProgC - Ponteiros 28
Resumo at aqui
Outro exemplo
//contador incrementado dentro da funo
#include <stdio.h>
void inc_contador(int *conta_ptr)
{
(*conta_ptr)++;
}
int main()
{
int conta = 0;
while (conta < 10)
inc_contador(&conta);
printf(conta = %d\n, conta);
return (0);
}
ProgC - Ponteiros 37
Ponteiros como argumentos de
funes
#include <stdio.h>
void inc_contador
(int *conta_ptr)
{
(*conta_ptr)++;
}
int main()
{
int conta = 0;
while (conta < 10)
inc_contador(&conta);
return (0);
}
ProgC - Ponteiros 38
Exerccio
Use ponteiros
Os operadores
++, --
Em C, os elementos de um vetor so
guardados sequencialmente, a uma distncia
fixa um do outro
E com printf(%d,(*array_ptr)+1); ?
char array[5] = {5, 10, 15, 20, 25};
char *array_ptr = &array[0];
ProgC - Ponteiros 48
Ponteiros e Vetores (Arrays)
Programa Exemplo
Definir vetor
preced1-ponteiros.c
preced2-ponteiros.c
ProgC - Ponteiros 61
Cuidados com ponteiros
j vimos exemplos
Mais em
http://en.wikipedia.org/wiki/Dangling_pointer
ProgC - Ponteiros 62
Cuidados com ponteiros
#include <stdio.h>
int* funcao(void) {
int num = 1234;
printf("O endereo de num: %p\n", &num);
printf("O valor de num: %d\n", num);
return #
}
int main(void) {
int *ptr;
ptr=funcao();
printf("O endereo apontado por ptr: %p\n", ptr);
printf("O valor apontado por ptr: %d\n", *ptr); //
aqui j virou lixo, porque num est fora de escopo
return(0);
}
ProgC - Ponteiros 63
Cuidados com ponteiros
#include <stdio.h>
int main(void) {
int *ptr;
{
int num=21; //escopo de num dentro deste bloco
ptr=#
printf("O endereo apontado por ptr: %p\n", ptr);
printf("O valor apontado por ptr: %d\n", *ptr);
}
//num saiu de escopo
printf("O endereo apontado por ptr: %p\n", ptr);
printf("O valor apontado por ptr: %d\n", *ptr); //
embora possa mostrar um num. ainda vlido, um
problema em potencial
return(0);
}
ProgC - Ponteiros 64
Cuidados com ponteiros
#include <stdio.h>
int main(void) {
char frase[6]="12345";
char *ptr=frase;
printf("caractere[0]=%c\n", *ptr);
ptr++;
printf("caractere[1]=%c\n", *ptr);
ptr+=3;
*ptr='A';
printf("caractere[4]=%c\n", *ptr);
ptr++;
printf("caractere[5]=%x\n", *ptr);//final da string (\0)
ptr++;//saiu da "frase"
*ptr='F';//est acessando endereo fora da string
printf("caractere fora=%c\n", *ptr);
printf("frase=%s\n", frase);
return 0;
}
ProgC - Ponteiros 65
SADA DO DEBUGGER (gdb)
Breakpoint 1, main () at ponteiro-fora-escopo3.c:3
3 char frase[6]="12345";
4 char *ptr=frase;
6 printf("caractere[0]=%c\n", *ptr);
(gdb) print &frase
$1 = (char (*)[6]) 0xbf99964a
(gdb) x/8cb 0xbf99964a
0xbf99964a: 49 '1' 50 '2' 51 '3' 52 '4' 53
'5' 0 '\0' 74 'J' -106 '\226'
7 ptr++;
8 printf("caractere[1]=%c\n", *ptr);
9 ptr+=3;
10 *ptr='A';
11 printf("caractere[4]=%c\n", *ptr);
12 ptr++;
ProgC - Ponteiros 66
SADA DO DEBUGGER (gdb) (continuao)
13 printf("caractere[5]=%x\n", *ptr);
(gdb) x/8cb 0xbf99964a
0xbf99964a: 49 '1' 50 '2' 51 '3' 52 '4' 65
'A' 0 '\0' 79 'O' -106 '\226'
14 ptr++;//saiu da "frase"
15 *ptr='F';//est acessando endereo invlido
16 printf("caractere fora=%c\n", *ptr);
17 printf("frase=%s\n", frase);
(gdb) x/8cb 0xbf99964a
0xbf99964a: 49 '1' 50 '2' 51 '3' 52 '4' 65
'A' 0 '\0' 70 'F' -106 '\226'
18 return 0;
19 }
ProgC - Ponteiros 67
Cuidados com ponteiros
Ver discusso em
http://stackoverflow.com/questions/2583656/what-is-the-meaning-of-wild-pointer-in-c
ProgC - Ponteiros 68
Ponteiros const
http://home.netcom.com/~tjensen/ptr/pointers.htm
http://br.geocities.com/cesarakg/pointers.html
http://pt.wikibooks.org/wiki/Programar_em_C/Ponteiros
http://www.difranco.net/cop2220/op-prec.htm