Вы находитесь на странице: 1из 8

Mdulo 7 Ponteiros

http://www.dee.feis.unesp.br/graduacao/disciplinas/langc/modulo_ling...

Mdulo 7 Ponteiros
7.1 Ponteiros como Endereos
Como j foi visto, uma varivel o nome de uma posio na memria que pode armazenar um valor de um determinado tipo. Os programas referenciam cada posio na memria usando um endereo exclusivo. Um ponteiro uma varivel ou um valor que contem um endereo. A Linguagem C utiliza muito os ponteiros. Quando se passa matrizes ou string para as funes, o compilador C passa um ponteiro. Da mesma forma, quando uma funo precisa alterar o valor de um parmetro, o programa deve passar para a funo um ponteiro para o endereo de memria da varivel.

7.2 Determinando o Endereo de uma Varivel


Um ponteiro um endereo de uma posio na memria. Quando os programas trabalham com matrizes (e strings), o programa trabalha com um ponteiro para o primeiro elemento da matriz. Quando os programas precisarem determinar o endereo de uma varivel, devero usar o operador de endereo da Linguagem C &. Por exemplo, o programa a seguir usa o operador de endereo para exibir o endereo de vrias variveis diferentes:
#include <stdio.h> void main(void) { int conta = 1; float salario = 40000.0; long distancia = 1234567L; printf("O endereo de conta %x\n", &conta); printf("O endereo de salario %x\n", &salario); printf("O endereo de distancia %x\n", &distancia); }

7.3 Como a Linguagem C trata Matrizes como Ponteiros


J foi visto anteriormente que um compilador C trata as matrizes como ponteiros. Por exemplo, quando um programa passa uma matriz para uma funo, o compilador passa o endereo inicial da matriz. O programa a seguir exibe o endereo inicial de vrias matrizes diferentes:
#include <stdio.h> void main(void) { int conta[10]; float salarios[5]; long distancia[10]; printf("O endereo da matriz conta %x\n", conta); printf("O endereo da matriz salarios %x\n", salarios); printf("O endereo da matriz distancia %x\n", distancia); }

7.4 Aplicando o Operador de Endereo (&) a uma Matriz


Se o operador de endereo for aplicado a uma matriz, a Linguagem C retornar o endereo inicial da matriz. Portanto, aplicar o operador de endereo a uma matriz redundante. O programa a seguir exibe o endereo inicial de uma matriz, seguido pelo ponteiro que o operador de endereo retorna:
#include <stdio.h> void main(void)

1 de 8

25/03/2012 16:49

Mdulo 7 Ponteiros

http://www.dee.feis.unesp.br/graduacao/disciplinas/langc/modulo_ling...

{ int conta[10]; float salarios[5]; long distancias[10]; printf("O endereo da matriz conta %x &conta %x\n", conta, &conta); printf("O endereo da matriz salarios %x &conta %x\n", salarios, &salarios); printf("O endereo da matriz distancias %x &distancias %x\n", distancias, &distancias); }

7.5 Declarando Variveis Ponteiros


medida que os programas tornarem-se mais complexos, ponteiros so usados com muita freqncia. Para armazenar ponteiros, os programas precisam declarar variveis ponteiros. Para declarar um ponteiro, precisa-se especificar o tipo do valor ao qual o ponteiro aponta (tal como int, float, char, etc.) e um asterisco (*) antes do nome da varivel. Por exemplo, o comando a seguir declara um ponteiro para um valor do tipo int:
int *iptr;

Como qualquer varivel, precisa-se atribuir um valor a uma varivel ponteiro antes de poder usar o ponteiro dentro do programa. Quando atribui-se um valor a um ponteiro, realmente atribui um endereo. Assumindo que anteriormente tenha-se declarado int conta, o comando a seguir atribui o endereo da varivel conta ao ponteiro iptr:
iptr = &conta; /* Atribui o endereo de conta a iptr */

O programa a seguir declara a varivel ponteiro iptr e atribui ao ponteiro o endereo da varivel conta. O programa ento exibe o valor da varivel ponteiro, juntamente com o endereo de conta:
#include <stdio.h> void main(void) { int *iptr; int conta = 1;

/* Declara variavel ponteiro */

iptr = &conta; printf("Valor de iptr %x Valor de conta %d Endereo de conta %x\n", iptr, conta, &conta); }

7.6 Desreferenciando um Ponteiro


Desreferenciar um ponteiro o processo de acessar o valor de uma posio de memria especfica. Para desreferenciar o valor de um ponteiro, usa-se o operador asterisco de indireo (*). Por exemplo, o comando printf a seguir exibe o valor apontado pelo ponteiro inteiro iptr:
printf(O valor apontado po iptr %d\n, *iptr);

Da mesma forma, o comando a seguir atribui o valor apontado pela varivel iptr para a varivel conta:
conta = *iptr;

Finalmente, o comando a seguir atribui o valor 7 posio de memria apontada por iptr:
*iptr = 7;

7.7 Usando Valores de Ponteiro


2 de 8 25/03/2012 16:49

Mdulo 7 Ponteiros

http://www.dee.feis.unesp.br/graduacao/disciplinas/langc/modulo_ling...

O programa a seguir atribui ao ponteiro int iptr o endereo da varivel conta. O programa depois exibe o valor do ponteiro e o valor armazenado na posio apontada pelo ponteiro (o valor contador). O programa ento modifica o valor apontado pelo ponteiro, como mostrado aqui:
#include <stdio.h> void main(void) { int contador = 10; int *iptr;

/* Declara valor do ponteiro */

iptr = &contador; /* Atribui o endereo */ printf("Endereo em iptr %x Valor em *iptr %d\n", iptr, *iptr); *iptr = 25; /* Altera o valor na memria */

printf("Valor de contador %d\n", contador); }

7.8 Ponteiros com Parmetros de Funo


O Mdulo de Funes examina em detalhes o processo de passar parmetros para as funes. Quando for necessrio alterar o valor de um parmetro, dever passar para a funo um ponteiro para um parmetro. O programa a seguir usa os ponteiros para dois parmetros do tipo int para permutar os valores das variveis, como mostrado a seguir:
#include <stdio.h> void troca_valores(int *a, int *b) { int temp; temp = *a; /* Armazena temporariamente o valor */ /* apontado por a */ *a = *b; /* Atribui o valor de b a a */ *b = temp; /* Atribui o valor de a a b */ } void main(void) { int um = 1, dois = 2; troca_valores(&um, &dois); printf("um contm %d dois contm %d\n", um, dois); }

Como pode ser visto, dentro da funo, os comandos desreferenciam os ponteiros usando o operador de indireo (*). O programa passa o endereo de cada varivel para a funo usando o operador de endereo (&).

7.9 A Aritmtica de Ponteiros


Um ponteiro um endereo que aponta para um valor de um determinado tipo na memria. Nos termos mais simples possveis, um ponteiro um valor que aponta para uma posio de memria especfica. Se somar-se o valor 1 a um ponteiro, o ponteiro apontar para a prxima posio de memria. Se somar-se 5 ao valor de um ponteiro, o ponteiro apontar para a posio de memria de cinco posies adiante do endereo atual. No entanto, a aritmtica de ponteiro no to simples quanto parece. Por exemplo, assuma que um ponteiro contenha o endereo 1000. Se fosse somado 1 ao ponteiro, poderia se esperar que o resultado fosse 1001. No entanto, o endereo resultante depende do tipo de ponteiro. Por exemplo, se fosse somado 1 a um ponteiro do tipo char (que contm 1000), o endereo resultante ser 1001. Se fosse somado 1 a um ponteiro do tipo int (que requer dois bytes na memria), o endereo resultante ser 1002. Quando for efetuada a aritmtica de ponteiro necessrio ter em mente o tipo de ponteiro. Alm de somar valores aos ponteiros, os programas podero subtrair valores ou somar e subtrair

3 de 8

25/03/2012 16:49

Mdulo 7 Ponteiros

http://www.dee.feis.unesp.br/graduacao/disciplinas/langc/modulo_ling...

dois ponteiros.

7.10 Incrementando e Decrementando um Ponteiro


Uma das operaes mais comuns com ponteiros o incremento e o decremento do valor de um ponteiro para apontar para a prxima posio ou para a posio anterior na memria. O programa a seguir atribui o endereo inicial de uma matriz de valores inteiros ao ponteiro iptr. O programa depois incrementa o valor do ponteiro para exibir os cinco elementos que a matriz contm:
#include <stdio.h> void main(void) { int valores[5] = {1, 2, 3, 4, 5}; int contador; int *iptr; iptr = valores; for (contador = 0; contador < 5; contador++) { printf("%d\n", *iptr); iptr++; } }

7.11 - Percorrendo uma String usando um Ponteiro


Uma string uma matriz de caracteres terminada p NULL. O programa a seguir usa a funo exibe_string para exibir uma string de caracteres usando um ponteiro:
#include <stdio.h> void exibe_string(char *string) { while (*string) putchar(*string++); } void main(void) { exibe_string("Unesp Ilha Solteira"); }

Como pode ser visto, a funo exibe_string declara a varivel string como um ponteiro. Usando o ponteiro, a funo simplesmente percorre os caracteres da string at encontrar o caractere NULL. Para exibir o caractere, a funo exibe_string primeiro desreferencia o endereo do ponteiro (obtendo o caractere). Em seguida, a funo incrementa o ponteiro para apontar para o prximo caractere na string.

7.12 - Funes que retornam Ponteiros


O valor que uma funo retorna sempre do tipo declarado no prottipo ou cabealho da funo. Alm de retornar esses tipos bsicos, as funes podem declarar ponteiros para os valores. Por exemplo, a funo fopen, que a maioria das funes da Linguagem C usam para abrir um canal de arquivo, retorna um ponteiro para uma estrutura do tipo FILE, como mostrado aqui:
FILE *fopen(const char *nomecaminho, const char *modo);

7.13 Criando uma Funo que retorna um Ponteiro


O programa a seguir cria uma funo chamada string_maiusc que converte todos os caracteres de uma string para maisculas e depois retorna um ponteiro para uma string:
#include <stdio.h> #include <ctype.h> char *string_maiusc(char *string) {

4 de 8

25/03/2012 16:49

Mdulo 7 Ponteiros

http://www.dee.feis.unesp.br/graduacao/disciplinas/langc/modulo_ling...

char *ender_inicial, *temp; ender_inicial = temp = string; while (*string) *(temp++) = toupper(*string++); return(ender_inicial); } void main(void) { char *titulo = "UNESP Ilha Solteira"; char *string; string = string_maiusc(titulo); printf("%s\n", string); printf("%s\n", string_maiusc("Matrizes e Ponteiros")); }

7.14 - Uma Matriz de Ponteiros


Assim como pode-se criar funes que retornam ponteiros, tambm pode-se criar matrizes de ponteiros. Mais comumente sero usadas matrizes para conter strings de caracteres. Como exemplo, a declarao a seguir cria uma matriz chamada dias que contm ponteiros para string de caracteres:
char *dias[7]= {Domingo, Sexta, Sbado}; Segunda, Tera, Quarta, Quinta,

Se for examinado o tipo da matriz da direita para a esquerda, ser visto que a matriz contm sete elementos. O asterisco antes do nome da varivel especifica um ponteiro. Se combinar o nome do tipo char que precede o nome da varivel, a declarao se tornar uma matriz de ponteiros para strings de caractere.

7.15 - Percorrendo em um Lao uma Matriz de Strings de Caracteres


Ao criar uma matriz de string de caracteres, a Linguagem C armazena os ponteiros para cada string dentro dos elementos da matriz. O programa a seguir percorre em um lao a matriz dias, que contm ponteiros para strings que contm os nomes dos dias da semana, como mostrado aqui:
#include <stdio.h> void main(void) { char *dias[7] = {"Domingo", "Segunda", "Tera", "Quarta", "Quinta", "Sexta", "S bado"}; int i; for (i = 0; i < 7; i++) printf("dias[%d] contm %s\n", i, dias[i]); }

7.16 Usando um Ponteiro para um Ponteiro para String de Caracteres


A declarao a seguir cria um ponteiro para uma string de caracteres:
char **dia_til_ptr;

O programa a seguir usa um ponteiro para um ponteiro para string de caracteres para exibir o contedo da matriz diasuteis:
#include <stdio.h> void main(void) { char *diasuteis[] = {"Segunda", "Tera", "Quarta", "Quinta", "Sexta", "" }; char **dia_util; dia_util = diasuteis;

5 de 8

25/03/2012 16:49

Mdulo 7 Ponteiros

http://www.dee.feis.unesp.br/graduacao/disciplinas/langc/modulo_ling...

while (*dia_util) printf("%s\n", *dia_util++); }

Quando o programa inicia, ele atribui ao ponteiro dia_til o endereo inicial da matriz diasuteis (o endereo da string Segunda). O programa repete ento um lao at encontrar o ponteiro para a string NULL (a condio final).

7.17 Declarando uma Constante String usando um Ponteiro


Muitas vezes strings de caracteres so inicializadas como segue:
char titulo[] = Unesp Ilha Solteira;

Quando se declara uma matriz com colchetes vazios, o compilador C aloca memria suficiente para armazenar os caracteres especificados (e o terminador NULL), atribuindo varivel titulo um ponteiro para o primeiro caractere. Como o compilador C automaticamente aloca a memria necessria e depois trabalha com um ponteiro para a memria, os programas podem usar um ponteiro de string de caracteres, em vez de uma matriz, como mostrado a seguir:
char *titulo = Unesp Ilha Solteira;

7.18 O Ponteiro do tipo Void


Ao declarar uma varivel ponteiro, preciso especificar o tipo do valor para o qual o ponteiro aponta. Quanto se faz isso, o compilador pode, mais tarde, efetuar aritmtica de ponteiros corretamente e adicionar os valores de deslocamentos corretos quando incrementar ou decrementar o ponteiro. Em alguns casos, no entanto, os programas no manipularo o valor de um ponteiro de qualquer maneira. Em vez disso, os programas somente iro obter um ponteiro para uma posio de memria com a qual o programa determinar o uso do ponteiro. Nesses casos, os programas podero criar um ponteiro para o tipo void, como mostrado aqui:
void *ponteiro_memoria;

7.19 Ponteiros para as Funes


A Linguagem C permite criar ponteiros para todos os tipos de dados. Alm disso, ela permite que os programas criem e usem ponteiros para as funes. O uso mais comum dos ponteiros para funes permitir que os programas passem uma funo como um parmetro para outra funo. As seguintes declaraes criam ponteiros para funes:
int (*min)(); int (*max)(); float (*media)();

Observe o uso dos parnteses entre os nomes das variveis. Se os parnteses fossem removidos, as declaraes serviriam como prottipos de funo para as funes que retornam ponteiros para um tipo especfico, como mostrado aqui:
int *min(); int *max(); float *media();

Ao ler uma declarao de varivel, deve-se comear com a declarao mais interna que aparece dentro dos parnteses, e, depois, trabalha-se da direita para a esquerda:
int (*min)();

7.20 Ponteiro para uma Funo


O uso mais comum de um ponteiro para uma funo passar essa funo como um parmetro para outra funo. O programa a seguir passa a funo min ou max para a funo pega_result. Dependendo da

6 de 8

25/03/2012 16:49

Mdulo 7 Ponteiros

http://www.dee.feis.unesp.br/graduacao/disciplinas/langc/modulo_ling...

funo que o programa passa, o valor que pega_result retorna ser diferente:
#include <stdio.h> int pega_result(int a, int b, int (*compare)()) { return(compare(a, b)); // Chama a funo passada } int max(int a, int b) { printf("Em max\n"); return((a > b) ? a: b); } int min(int a, int b) { printf("Em min\n"); return((a < b) ? a: b); } void main(void) { int result; result = pega_result(1, 2, &max); printf("O maximo entre 1 e 2 %d\n", result); result = pega_result(1, 2, &min); printf("O minimo de 1 e 2 %d\n", result); }

7.21 Usando um Ponteiro para um Ponteiro para um Ponteiro


A Linguagem C permite criar variveis que so ponteiros para outros ponteiros. Em geral, no h limite no nmero de indirees (ponteiros para ponteiros) que os programas podem usar. No entanto, para a maioria dos programadores, usar mais do que um ponteiro para um ponteiro resultar em confuso considervel, e tornar seus programas muito difceis de compreender. Por exemplo, o programa a seguir usa trs nveis de ponteiros para um valor do tipo int. Separe um tempo para experimentar este programa e desenhe os nveis de indireo em um pedao de papel at compreender o processamento que ele executa:
#include <stdio.h> int qual_e_o_valor(int ***ptr) { return(***ptr); } void main(void) { int *nivel_1, **nivel_2, ***nivel_3, valor = 1001; nivel_1 = &valor; nivel_2 = &nivel_1; nivel_3 = &nivel_2; printf("O valor %d\n", qual_e_o_valor(nivel_3)); }

7.22 Sntese do Mdulo


apresentado seguir, uma sntese do que foi tratado em cada item deste mdulo. Com esta sntese voc poder relembrar conceitos vistos durante nosso estudo ou mesmo direcionar seu estudo, caso voc j tenha conhecimentos na Linguagem C. 7.1 Ponteiros como Endereos: visto que um ponteiro uma varivel ou um valor que contem um endereo. 7.2 Determinando o Endereo de uma Varivel: foi visto como obter um endereo de uma varivel e quando os programas precisarem determinar o endereo de uma varivel, devero usar o operador de endereo da Linguagem C &. 7.3 Como a Linguagem C trata Matrizes como Ponteiros: mostrado o cdigo de um programa que exibe o endereo inicial de vrias matrizes diferentes. 7.4 Aplicando o Operador de Endereo (&) a uma Matriz: foi visto que se o operador de endereo for aplicado a uma matriz, a Linguagem C retornar o endereo inicial da matriz.
7 de 8 25/03/2012 16:49

Mdulo 7 Ponteiros

http://www.dee.feis.unesp.br/graduacao/disciplinas/langc/modulo_ling...

7.5 Declarando Variveis Ponteiros: foi visto que para declarar um ponteiro, precisa-se especificar o tipo do valor ao qual o ponteiro aponta (tal como int, float, char, etc.) e um asterisco (*) antes do nome da varivel. 7.6 Desreferenciando um Ponteiro: foi explicado que desreferenciar um ponteiro o processo de acessar o valor de uma posio de memria especfica. Para desreferenciar o valor de um ponteiro, usa-se o operador asterisco de indireo (*). 7.7 Usando Valores de Ponteiro: foi apresentado o cdigo de um programa em que o valor de um ponteiro usado para receber o endereo de uma varivel de depois o ponteiro usado para indicar o valor armazenado na posio de memria que ele indica. 7.8 Ponteiros com Parmetros de Funo: foi visto que quando for necessrio alterar o valor de um parmetro, dever passar para a funo um ponteiro para um parmetro. Foi apresentado um programa que usa os ponteiros para dois parmetros do tipo int para permutar os valores das variveis. 7.9 A Aritmtica de Ponteiros: foi explicada de manira clara a aritmtica de ponteiros, que trata os ponteiros como valores que podem ser somados ou subtrados. 7.10 Incrementando e Decrementando um Ponteiro: foram vistas as operaes de incremento e o decremento do valor de um ponteiro, que servem para apontar para a prxima posio ou para a posio anterior na memria. 7.11 Percorrendo uma String usando um Ponteiro: foi visto um programa que usa uma funo para exibir uma string de caracteres usando um ponteiro. 7.12 Funes que retornam Ponteiros: foi explicado que o valor que uma funo retorna sempre do tipo declarado no prottipo ou cabealho da funo. Alm de retornar esses tipos bsicos, as funes podem declarar ponteiros para os valores. 7.13 Criando uma Funo que retorna um Ponteiro: foi visto um programa que cria uma funo que converte todos os caracteres de uma string para maisculas e depois retorna um ponteiro para uma string. 7.14 Uma Matriz de Ponteiros: foi explicado que assim como pode-se criar funes que retornam ponteiros, tambm pode-se criar matrizes de ponteiros. Mais comumente sero usadas matrizes para conter strings de caracteres. 7.15 Percorrendo em um Lao uma Matriz de Strings de Caracteres: foi visto um programa que percorre em um lao uma matriz , que contm ponteiros para strings que contm os nomes dos dias da semana. 7.16 Usando um Ponteiro para um Ponteiro para String de Caracteres: foi visto um programa que usa um ponteiro para um ponteiro para string de caracteres para exibir o contedo de uma matriz. 7.17 Declarando uma Constante String usando um Ponteiro: foi visto como declarar uma constante string usando um ponteiro. void. 7.19 Ponteiros para as Funes: foi visto que a Linguagem C permite que os programas criem e usem ponteiros para as funes. 7.20 Ponteiro para uma Funo: foi visto que o uso mais comum de um ponteiro para uma funo passar essa funo como um parmetro para outra funo. 7.21 Usando um Ponteiro para um Ponteiro para um Ponteiro: foi visto que a Linguagem C permite criar variveis que so ponteiros para outros ponteiros. Em geral, no h limite no nmero de indirees (ponteiros para ponteiros) que os programas podem usar. 7.18 O Ponteiro do tipo Void: foi dada uma explicao geral sobre o ponteiro do tipo

8 de 8

25/03/2012 16:49