Você está na página 1de 7

04/04/2013

Prof. Dr. Lelis Tetsuo Murakami

Ponteiros e endereos Pointers e address


Ponteiro uma varivel que contm o endereo de outra varivel; So muito usados em C:
Por ser a nica forma de acesso varivel; Proporciona cdigos mais compactos;

O endereo de uma varivel se obtm atravs de &variavel Seja x uma varivel definida como int;
O ponteiro (que guarda o endereo de x) px = &x Se px um ponteiro que guarda o endereo de X Endereo Se escreve &x

ento ... px = &x = 890

890 X

Prof. Dr. Lelis Tetsuo Murakami

04/04/2013

Ponteiros
Se px = &x ento px aponta para a varivel x; Exemplos de erros utilizando &:
&5 est errado; &(x+1) est errado;

Se px um ponteiro ento guarda um endereo que suponha ser da varivel x. Ento:


O comando y = *px armazena na varivel y o valor para o qual px aponta; No endereo 890 mora o: 890 X Fazer y = *px equivale a y ser igual a:

px = &x = 890

Prof. Dr. Lelis Tetsuo Murakami

Ponteiros
Fazer px = &x; seguido de y = *px; o mesmo que y=x; Pointers podem aparecer em expresses. Vamos analisar cada um dos comandos abaixo:
y = *px + 1; (incrementa 1 em x e coloca em y) printf(%d\n, *px); (imprime x) d = sqrt ((double) *px); (calcula raiz x e pe em d) *px = 0; (faz x = 0) *px += 1; (faz x = x + 1) (*px)++; (faz x = x + 1) px = py; (faz x = y)

Prof. Dr. Lelis Tetsuo Murakami

04/04/2013

Aplicao de pointers
Em algoritmos de classificao, comum a funo de trocar um valor pelo outro, chamada de swap; A chamada funo se efetua pelo comando swap (&a,&b); Os argumentos em C so passados by value e assim impede a manipulao das variveis; Por isto, so utilizados os endereos (&) para poder alterar o contedo de variveis;
swap (px, py) int *px, *py; { int temp; temp = *px; *px = *py; *py = temp; }

Prof. Dr. Lelis Tetsuo Murakami

Pointers e arrays (vetores)


H um estreito relacionamento entre pointers e arrays; O comando int a[10]; define um vetor de 10 elementos:
a[0], a[1], a[2], ... A[9] Se pa um ponteiro para um valor inteiro declarado como: int *pa; ento o comando: pa = &a[0]; far com que pa aponte para o primeiro elemento do vetor a. O comando x = *pa; ir copiar o contedo de a[0] em x. Se pa aponta para um elemento por ex. a[5], ento pa+1 apontar para o elemento seguinte que a[6]. Por outro lado, o comando pa-i; ir apontar para o elemento i vezes anterior a pa. Portanto, se pa aponta para o elemento a[0] ento *(pa+1) apontar para o elemento a[1].

Prof. Dr. Lelis Tetsuo Murakami

04/04/2013

Acesso ao vetor
A referncia a um vetor convertido pelo compilador como um ponteiro para o primeiro elemento. Assim,
pa = &a[0]; o mesmo que pa = a;

#include <stdio.h> #include <stdlib.h> #include <string.h> /*retorna o comprimento da string s */ int tamstr(s) char *s; /* ou char[]; */ { int n; for (n = 0; *s != '\0' ; s++) n++; return(n); } int main() { int tamanho; printf("O tamanho da string Hello World : %d\n", tamstr("Hello World")); system("pause"); return(0); }

O elemento i-simo de um vetor pode ser escrito:


*(a+i);

Quando um vetor passado para uma funo, o que passado na verdade o ponteiro do primeiro elemento.

Prof. Dr. Lelis Tetsuo Murakami

Strlen comentado
/* modelo de strlen */ int strlen2(s) char *s; { char *p = s; while (*p != '\0') p++; return (p-s); }

Palavra: ndice: Endereo: Valor s: Valor p:

H 0 1 1 2

E 1 2 3

L 2 3 4

L 3 4 5

O 4 5 6

5 6 7

W 6 7 8

O 7 8 9

R 8 9

L D \0 9 10 10 11 12

10 11 12

Prof. Dr. Lelis Tetsuo Murakami

04/04/2013

Passagem de parmetro de um elemento do vetor


possvel passar parte de um vetor. Seja f uma funo qualquer ento:
f(&a[2]); ou f(a+2); passa para a funo f o endereo do elemento de ndice 2 do vetor a, correspondente ao terceiro elemento; A funo chamada deve declarar:
f(arr) int arr[]; {
...

Prof. Dr. Lelis Tetsuo Murakami

strcopy passando parmetro como vetor


strcpyVetor(s,t) /* copia t para s */ char s[], t[]; { int i; i=0; while ((s[i] = t[i]) != '\0) i++; } main () { char buf[] = "Hello World\0"; char pal[] = ""; strcpyVetor(pal, buf); printf("copia com MaisVetor = %s\n", &pal); system("pause"); }

Prof. Dr. Lelis Tetsuo Murakami

10

04/04/2013

strcopy passando parmetro como ponteiro


strcpyPonteiro(s,t) char *s, *t; { while ((*s = *t) != '\0) { s++; t++; } } main () { char buf[] = "Hello World\0"; char pal[] = ""; strcpyPonteiro(&pal, &buf); printf("copia com Ponteiro = %s\n", &pal); system("pause"); } /* copia t para s */

Prof. Dr. Lelis Tetsuo Murakami

11

strcopy passando parmetro como ponteiro enxuto


strcpyEnxuto(s,t) /* copia t para s */ char *s, *t; { while ((*s++ = *t++) != '\0); } main () { char buf[] = "Hello World\0"; char pal[] = ""; strcpyEnxuto(&pal, &buf); printf("copia com Enxuto = %s\n", &pal); system("pause"); }

Prof. Dr. Lelis Tetsuo Murakami

12

04/04/2013

strcopy passando parmetro como ponteiro Mais enxuto


strcpyMaisEnxuto(s,t) char *s, *t; { while (*s++ = *t++); } main () { char buf[] = "Hello World\0"; char pal[] = ""; strcpyMaisEnxuto(&pal, &buf); printf("copia com MaisEnxuto = %s\n", &pal); system("pause"); } /* copia t para s */

Prof. Dr. Lelis Tetsuo Murakami

13

Contato

Prof. Dr. Llis Murakami


Eng. Civil POLI-USP Doutor em Engenharia de Sistemas Digitais pela POLI-USP
www.lechare.com.br/modelos.htm lelistm@aedu.com

(11) 9 6084 1079

Prof. Dr. Lelis Tetsuo Murakami

14