Você está na página 1de 18

Ponteiros

Em Construo, com vi!!! copyright Adriano Cruz 1999

1. Introduo 2. Operaes com Ponteiros 1. Declarao de Ponteiros 2. Os Operadores de Ponteiros 3. Aritmtica de Ponteiros 3. Ponteiros e Vetores 1. Ponteiros e Strings 2. Alocao Dinmica de Memria 3. Ponteiros e Matrizes 4. Vetores de Ponteiros 5. Ponteiros para Ponteiros 4. Exerccios

Introduo
Ponteiros so usados em situaes em que necessrio conhecer o endereo onde est armazenada a varivel e no o seu contedo. Um ponteiro uma varivel que contm um endereo de memria e no o contedo da posio. A memria de um computador pode ser vista como uma sequncia de bytes cada um com seu prprio endereo. No h dois bytes com o mesmo endereo. O primeiro endereo sempre 0 e o ltimo geralmente uma potncia de 2. Por exemplo um computador com memria igual a 16 Mbytes tem 16x1024x1024 bytes. A figura abaixo mostra um mapa de um trecho de memria que contm duas variveis (num, res) inteiras de tipo longo (4 bytes cada uma). Observar que os endereos esto pulando de quatro em quatro j que as variveis so inteiras de tipo longo. Uma possvel declarao destas variveis dentro de um programa C poderia ser:
long int num=10, res=120;

Endereos Contedo Varivel 996 1000 --10 --num

1004

120

res

Tabela 8.1 Mapa de Memria Ponteiros so importantes por exemplo quando se deseja que uma funo retorne mais de um valor. Por exemplo, uma funo pode receber no os valores dos parmetros mas sim ponteiros que apontem para seus endereos. Assim esta funo pode modificar diretamente os contedos destas variveis. Uma outra aplicao importante de ponteiros apontar para reas de memria que so admnistradas durante a execuo do programa. Com ponteiros possvel alocar as posies de memria necessrias para armazenamento de vetores somente quando o programa estiver rodando. O programador pode reservar o nmero exato de posies que o programa requer.

Operaes com Ponteiros

Declarao de Ponteiros
Antes de serem usados os ponteiros, como as variveis, precisam ser declarados. A forma geral da declarao de um ponteiro a seguinte:
tipo *nome; Onde tipo qualquer

tipo vlido em C e nome o nome da varivel ponteiro. Por

exemplo:
int *res; float *div; /* ponteiro para uma variavel inteira */ /* ponteiro para uma variavel de ponto flutuante */

Os Operadores de Ponteiros
Existem dois operadores especiais para ponteiros: * e &. Os dois operadores so unrios, isto requerem somente um operando. O operador & devolve o endereo de memria do seu operando. Por exemplo,
pint = &soma; /* o endereco de soma e carregado em pint */

No exemplo seguinte considere a Tabela 8.1. Aps a execuo do trecho de programa abaixo a varivel ponteiro p termina com o valor 1000.
p = #

O operador * o complemento de &. O operador * devolve o valor da varivel localizada no endereo que o segue. Por exemplo, o comando

num = *p;

significa que a varivel num recebe o valor apontado por p. Estes operadores no devem ser confundidos com os j estudados em captulos anteriores. O operador * para ponteiros no tem nada a ver com o operador multiplicao. O operador ponteiro * unrio e, como o operador &, tem precedncia maior que do que todos os operadores aritmticos.

Aritmtica de Ponteiros
Atribuio de Ponteiros Do mesmo modo que uma varivel comum o contedo de um ponteiro pode ser passado para outro ponteiro do mesmo tipo. As variveis ponteiro devem sempre apontar para os tipos de dados corretos. Uma varivel ponteiro declarada como apontador de dados inteiros deve sempre apontar para dados deste tipo. Observar que em C possvel atribuir qualquer endereo a uma varivel ponteiro. Deste modo possvel atribuir o endereo de uma varivel do tipo float a um ponteiro inteiro. No entanto, o programa no ir funcionar da maneira correta. Por exemplo, no trecho de programa abaixo c8atribp.c o endereo do terceiro elemento do vetor v carregado em p1 e o endereo da varivel i carregado em p2. Alm disso no final o endereo apontado por p1 carregado em p2. Os comandos printf imprimem os valores apontados pelos ponteiros respectivos.

void main(void) { int vetor[] = { 10, 20, 30, 40, 50 }; int *p1, *p2; int i = 100; p1 = &vetor[2]; printf("%d\n", *p1); p2 = &i; printf("%d\n", *p2); p2 = p1; printf("%d\n", *p2); }

Acessando os Endereos O trecho de programa abaixo faz com que o endereo da varivel x seja carregado no ponteiro p. Em seguida o programa imprime o que est apontado por p.
void main(void) { float x=3.14; float *p; p = &x;

printf("*p = %f", *p); }

Incrementando e Decrementando Ponteiros O exemplo (c8incrp.c) abaixo mostra que operaes de incremento e decremento podem ser aplicadas em operandos. O primeiro printf imprime 30 o segundo 40 e o terceiro 50.
void main(void) { int vetor[] = { 10, 20, 30, 40, 50 }; int *p1; p1 = &vetor[2]; printf("%d\n", *p1); p1++; printf("%d\n", *p1); p1 = p1 + 1; printf("%d\n", *p1); }

Pode parecer estranho que um endereo que aponte para um nmero inteiro que armazenado em dois bytes seja incrementado por um e passe para apontar para o prximo nmero inteiro. A resposta para isto que sempre que um ponteiro incrementado (decrementado) ele passa a apontar para a posio do elemento seguinte (anterior). Do mesmo modo somar trs a um ponteiro faz com que ele passe apontar para o terceiro elemento aps o atual. Portanto, um incremento em um ponteiro que aponta para um valor que armazenado em n bytes faz que n seja somado ao endereo. possvel se usar o seguinte comando
*(p+1)=10;

Este comando armazena o valor 10 na posio seguinte quela apontada por p. possvel somar-se e subtrair-se inteiros de ponteiros. A operao abaixo faz com que o ponteiro p passe a apontar para o terceiro elemento aps o atual.
p = p + 3;

A diferena entre ponteiros fornece quantos elementos do tipo do ponteiro existem entre os dois ponteiros. No exemplo (c8difp.c) abaixo impresso o valor 3.
void main(void) { float vetor[] = { 1.0, 2.0, 3.0, 4.0, 5.0 }; float *p1, *p2; p1 = &vetor[2]; /* endereco do terceiro elemento */ p2 = &vetor; /* endereco do primeiro elemento */ printf("Diferenca entre ponteiros %d\n", p1-p2); }

No possvel multiplicar ou dividir ponteiros, e no se pode adicionar ou subtrair o tipo float ou o tipo double a ponteiros. Comparao de Ponteiros possvel comparar ponteiros em uma expresso relacional. S possvel comparar ponteiros de mesmo tipo. O trecho de programa abaixo ilustra um exemplo deste tipo de operaes.

char *c, *v; scanf("%c %c", c, v); if (c == v) printf("As variveis estao na mesma posicao.\n"); else printf("As variaveis nao estao na mesma posicao.\n");

Ponteiros e Vetores
Ponteiros e Vetores esto fortemente relacionados na linguagem C. O nome de um vetor um ponteiro que aponta para a primeira posio do vetor e todas as operaes j mencionadas para ponteiros podem ser executadas com um nome de vetor. Por exemplo, a declarao
int v[100];

declara um vetor de inteiros de 100 posies e a partir dela temos que v um ponteiro equivalente ao da declarao abaixo
int *v;

Por esta razo as seguintes declaraes so idnticas e podem ser intercambiadas independemente do modo como v foi declarado:
v[i] == *(v+i) &v[i] == v+i

O exemplo (c8vetpon.c) ilustrado abaixo mostra as duas notaes sendo usadas para imprimir o mesmo vetor.
void main(void) { float v[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; int i; for (i=0; i<9; i++) printf("%.1f ", v[i]); printf("\n"); for (i=0; i<9; i++) printf("%.1f ", *(v+i)); }

Existe uma diferena fundamental entre declarar um conjunto de dados como um vetor ou atravs de um ponteiro. Na declarao de vetor a compilador automaticamente reserva um bloco de memria para que o vetor seja armazenado. Quando apenas um ponteiro declarado a nica coisa que o compilador faz alocar um ponteiro para apontar para a memria, sem que espao seja reservado. O nome de um vetor chamado de ponteiro constante e, portanto, no pode ter o seu valor alterado. Assim, os comandos abaixo no so vlidos:
void main(){ int list[5], i;

/* O ponteiro list nao pode ser modificado recebendo o endereco de i */ list = &i /* O ponteiro list nao pode ser incrementado */ list++; }

Para percorrer um vetor alm da maneira mostrada no exemplo (c8vetpon.c) possvel usar um ponteiro varivel como ilustrado no exemplo (c8povar.c) abaixo.
void main(void) { float v[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; int i; float *p; for (i=0; i<9; i++) printf("%.1f ", v[i]); printf("\n"); for (i=0; i<9; i++) printf("%.1f ", *(v+i)); printf("\n"); for (i=0, p=v; i<9; i++, p++) printf("%.1f ", *p); }

Observe como o ponteiro p recebe seu valor inicial e a maneira que ele incrementado.

Ponteiros e Strings
Um string constante escrito como no exemplo: "Este e um string". At agora um dos usos mais comuns de strings constantes tem sido na funo printf, como no exemplo abaixo
printf("Acabou o programa.\n");

Quando um string como este enviado para a funo o que passado o ponteiro para o string. possvel ento carregar o endereo do string em um ponteiro do tipo char.
void main(void) { char *lista; lista = "Ola como vai?"; printf("%s", lista); }

No exemplo c8postr.c aparece uma funo que conta o nmero de caracteres de um string. Observe o ponteiro para o string constante e na funo o ponteiro *(s+tam++) apontando caracter a caracter.
int strtam(char *s); void main(void)

{ char *lista="1234567890"; printf("O tamanho do string \"%s\" e %d caracteres.\n", lista, strtam(lista)); printf("Acabou."); } int strtam(char *s){ int tam=0; while(*(s + tam++) != '\0'); return tam-1; }

Um outro exemplo (c8posta.c) ilustrado abaixo mostra uma funo que copia um string para outro.
int strcop(char *d, char *o); void main(void) { char destino[20]; char *origem="string de origem"; strcop(destino, origem); /* copia o string origem para o destino */ printf("%s\n", origem); printf("%s\n", destino); printf("Acabou.\n"); } int strcop(char *d, char *o){ while ((*d++ = *o++) != '\0'); return 1; }

Alocao Dinmica de Memria


As funes bsicas de alocao de memria so malloc(), calloc() e free(). Estas funes so encontradas na biblioteca stdlib.h. O exemplo (c8call1.c) abaixo ilustra o uso das funo calloc e free.
#include <stdio.h> #include <stdlib.h> void main(void) { float *v; int i, tam; printf("Qual o tamanho do vetor? "); scanf("%d", &tam); v = calloc(tam, sizeof(float)); if (v){ for (i=0; i<tam; i++){ printf("Elemento %d ?", i); scanf("%f", v+i);

printf("Li valor %f \n", *(v+i)); } free(v); } else printf("Nao consegui alocar memoria."); }

Um outro exemplo, agora empregando a funo malloc() est mostrado no exemplo maior.c. Observe que neste exemplo tambm mostramos exemplos onde um endereo de varivel foi passado para uma funo de modo que a funo main possa receber um valor (vezes).
void LeVetor (float *v, int tam); float ProcuraMaior (float *v, int tam, int *vezes); int main(void) { float *v, maior; int i, tam, vezes; printf("Qual o tamanho do vetor? "); scanf("%d", &tam); v = (float *) malloc(tam * sizeof(float)); if (v){ LeVetor(v, tam); maior = ProcuraMaior (v, tam, &vezes); printf("O maior elemento e %f e aparece %d vezes.\n.", maior, vezes); free(v); } else { printf("Nao consegui alocar memoria."); exit(1); } exit(0); } void LeVetor (float *v, int tam) { int i; for (i=0; i<tam; i++){ printf("Elemento %d ?", i); scanf("%f", v+i); printf("Li valor %f \n", *(v+i)); } } float ProcuraMaior (float *v, int tam, int *vezes) { int i; float maior; maior = v[0]; *vezes = 1; for (i=1; i<tam; i++) { if (v[i] > maior) { maior = v[i]; *vezes = 1; } else if (maior == v[i]) *vezes=*vezes+1;; }

return maior; }

Ponteiros e Matrizes
Um ponteiro aponta para uma rea de memria que endereada de maneira linear. Deste modo, necessrio mapear o endereo de cada elemento na matriz, que dado por linha coluna, em um endereo linear. Considere uma matriz chamada matriz de tamanho LIN,COL que poderia ser declarada e ter um de seus elementos lidos da seguinte maneira:
#define LIN 3 #define COL 4 void main(){ int matriz[LIN][COL]; for(i=0; i<LIN; i++){ for (j=0; j<COL; j++){ printf("Elemento %d %d = ", i, j); scanf("%d", matriz[i][j]); } } }

Caso o programa utilizasse ponteiros ao invs de notao de matrizes o trecho de programa ficaria da seguinte maneira:
#define LIN 3 #define COL 4 void main(void) { int *matriz; int i, j; matriz = malloc(LIN*COL*sizeof(int)); if (!matriz){ printf("Nao consegui alocar a memoria suficiente.\n"); exit(1); } for(i=0; i<LIN; i++){ for (j=0; j<COL; j++){ printf("Elemento %d %d = ", i, j); scanf("%d", matriz+(i*COL+j)); } }

Observe que o endereo de cada elemento da matriz teve de ser calculado explicitamente. O programa completo que mostra como a matriz poderia ser impressa est indicada no exemplo c8pomat.c.

Uma outra possibilidade utilizar vetores de ponteiros, onde cada linha corresponde a um vetor que apontado por um ponteiro. No item seguinte (Vetores de ponteiros) detalhamos este exemplo.

Vetores de Ponteiros
Como ponteiros tambm so variveis possvel ento criar vetores de ponteiros e utiliz-los. O programa exemplo c8vepon.c mostra um programa onde utilizado um vetor de ponteiros para linhas de caracteres.
#define LINHAS 10 #define COLUNAS 60 /* prototipos das funcoes */ void alocaespaco(char *linha[]); void lelinhas (char *linha[]); void imprimelinhas (char *linha[]); void ordenalinhas (char *linha[]); void main(void) { char *linha[LINHAS]; alocaespaco(linha); lelinhas(linha); imprimelinhas(linha); ordenalinhas(linha); imprimelinhas(linha); } /* Esta rotina aloca espaco para as linhas */ void alocaespaco(char *linha[]){ int i; for (i=0; i<LINHAS; i++){ if (!(linha[i] = malloc(COLUNAS*sizeof(int)))){ printf("Nao consegui alocar o vetor %d.\n", i); exit(i); } } } /* Esta rotina le linhas */ void lelinhas (char *linha[]){ int i; for (i=0; i<LINHAS; i++){ printf("Entre com a linha %d.\n", i); gets(linha[i]); } } /* Esta rotina imprime as linhas */ void imprimelinhas (char *linha[]){ int i; for (i=0; i<LINHAS; i++){ printf("Linha %d %s.\n", i, linha[i]);

} } void ordenalinhas( char *linha[]){ char trocou; char *p; int i; do { trocou = 0; for (i=0; i<LINHAS-1; i++){ if (strcmp(linha[i], linha[i+1]) >0){ p = linha[i]; linha[i] = linha[i+1]; linha[i+1] = p; trocou = 1; } } } while (trocou); }

Observe na rotina main a declarao


char *linha[LINHAS];

que define um vetor de tamanho LINHAS. Este vetor contem ponteiros e no valores. At este momento temos apenas posies reservadas para armazenar ponteiros. A alocao de espao e a inicializao dos ponteiros feita na rotina alocaespaco. Como cada elemento do vetor um ponteiro o ponteiro retornado pela funo malloc armazenado em cada um dos elementos do vetor. Portanto linha[i] um ponteiro pode ser usado como parmetro das funes gets e printf. Um ponto importante da ordenao das linhas que a troca de posio das linhas involve somente a troca dos ponteiros das linhas a serem trocadas e no o seu contedo, o que muito mais rpido.

Ponteiros para Ponteiros


No exemplo anterior podemos observar que o nmero de linhas da matriz fixa, e portanto, h uma mistura de notao de ponteiros com matrizes. Vamos considerar um exemplo onde tanto o nmero de linhas como o de colunas desconhecido. Neste exemplo iremos criar um vetor de ponteiros que ir armazenar o endereo inicial de cada linha. Portanto, para obter um elemento da matriz primeiro devemos descobrir onde est a linha no vetor que armazena os endereos das linhas, em seguida procuramos na linha o elemento. A figura 8.1 ilustra como ser feito o armazenamento desta matriz.

O programa exemplo (c8pp.c), listado a seguir, ir pedir ao usurio que digite o nmero de linhas e colunas da matriz. Em seguida ler todos os elementos da matriz e por ltimo ir trocar duas linhas da matriz de posio. Observe que agora foi criado um ponteiro para ponteiro chamado de **matriz. O programa primeiro pergunta o nmero de linhas da matriz para poder alocar espao para armazenar os ponteiros para cada uma das linhas. Em seguida alocado espao para armazenar cada uma das linhas. Notar que a troca de linhas da matriz involve simplesmente a troca de dois ponteiros e no a troca de todos os elementos das linhas. Esta soluo muito mais rpida do que a anterior, especialmente para matrizes grandes.
#include<stdio.h> #include<stdlib.h> void main () { int **matriz; /* ponteiro para os ponteiros de cada uma das linhas */ int lin, col; /* nmero de linhas e colunas */ int i, j; int linha1, linha2; /* linhas da matriz que serao trocadas */ char linha[80]; /* linha de caracteres com os dados */ int *temp; do { puts("Qual o numero de linhas?"); gets(linha); lin = atoi(linha); } while (lin<=0); printf("Numero de linhas = %d\n", lin);

printf("Alocando espao para armazenar os ponteiros para as linhas.\n"); matriz = (int **) malloc (lin * sizeof(int *)); if (!matriz) { puts("Nao h espao para alocar memria"); exit(1); } do { puts("Qual o numero de colunas?"); gets(linha); col = atoi(linha); } while (col<=0); printf("Numero de colunas = %d\n", lin); printf("Alocando espao para armazenar os vetores de linhas.\n"); for (i=0; i<lin; i++) { *(matriz +i) = (int *) malloc(col * sizeof (int)); if (! *(matriz+i) ){ printf("No h espao para alocar a linha %d", i); exit(1); } } puts("Entre com os dados"); for (i=0; i<lin; i++) { printf("Entre com a linha %d\n", i); for (j=0; j<col; j++) { printf("Elemento %d %d\n", i, j); scanf("%d", *(matriz +i) +j); } } puts("Dados lidos"); for (i=0; i<lin; i++) { for (j=0; j<col; j++) { printf("%7d ", *(*(matriz +i) +j)); } printf("\n"); } getchar(); do { puts("Qual a primeira linha a ser trocada?"); gets(linha); linha1=atoi(linha); } while (linha1 >=lin); do { puts("Qual a segunda linha a ser trocada?"); gets(linha); linha2=atoi(linha); } while (linha2 >=lin); temp = *(matriz + linha1); *(matriz + linha1) = *(matriz + linha2); *(matriz + linha2) = temp; puts("Dados trocados.");

for (i=0; i<lin; i++) { for (j=0; j<col; j++) { printf("%7d ", *(*(matriz +i) +j)); } printf("\n"); } }

A seguir mostramos (c8ppf.c) o exemplo anterior modificado para utilizar funes. O propsito mostrar como ficam as chamadas e as definies das funes que utilizam ponteiros para ponteiros.
#include<stdio.h> #include<stdlib.h> int **aloca_linhas(int ); void aloca_colunas (int **, int, int); void le_dados(int **, int, int ); void imprime_matriz(int **, int, int ); void troca_linhas (int **, int, int); void main () { int **matriz; /* ponteiro para os ponteiros de cada uma das linhas */ int lin, col; /* nmero de linhas e colunas */ int linha1, linha2; /* linhas da matriz que serao trocadas */ char linha[80]; /* linha de caracteres com os dados */ do { puts("Qual o numero de linhas?"); gets(linha); lin = atoi(linha); } while (lin<=0); printf("Numero de linhas = %d\n", lin); printf("Alocando espao para armazenar os ponteiros para as linhas.\n"); matriz = aloca_linhas(lin); do { puts("Qual o numero de colunas?"); gets(linha); col = atoi(linha); } while (col<=0); printf("Numero de colunas = %d\n", lin); printf("Alocando espao para armazenar os vetores de linhas.\n"); aloca_colunas(matriz, lin, col); le_dados(matriz, lin, col); puts("Imprimindo dados lidos"); imprime_matriz(matriz, lin, col);

getchar(); do { puts("Qual a primeira linha a ser trocada?"); gets(linha); linha1=atoi(linha); } while (linha1 >=lin); do { puts("Qual a segunda linha a ser trocada?"); gets(linha); linha2=atoi(linha); } while (linha2 >=lin); troca_linhas(matriz, linha1, linha2); puts("Imprimindo dados trocados."); imprime_matriz(matriz, lin, col); } int **aloca_linhas(int lin) { int **m; m = (int **) malloc (lin * sizeof(int *)); if (!m) { puts("Nao h espao para alocar memria"); exit(1); } return m; } void aloca_colunas(int **matriz, int lin, int col) { int i; for (i=0; i<lin; i++) { *(matriz +i) = (int *) malloc(col * sizeof (int)); if (! *(matriz+i) ){ printf("No h espao para alocar a linha %d", i); exit(1); } } } void le_dados (int **matriz, int lin, int col) { int i, j; puts("Entre com os dados"); for (i=0; i<lin; i++) { printf("Entre com a linha %d\n", i); for (j=0; j<col; j++) { printf("Elemento %d %d\n", i, j); scanf("%d", *(matriz +i) +j); } } }

void imprime_matriz (int **matriz, int lin, int col) { int i, j; for (i=0; i<lin; i++) { for (j=0; j<col; j++) { printf("%7d ", *(*(matriz +i) +j)); } printf("\n"); } } void troca_linhas ( int **matriz, int linha1, int linha2) { int *temp; temp = *(matriz + linha1); *(matriz + linha1) = *(matriz + linha2); *(matriz + linha2) = temp; }

Exerccios
1. O que ser impresso pelo progama nome.c assumindoque a entrada fornecida o seu nome completo. Assuma que no h nenhum espao em branco antes do incio do nome. 2. Escreva um programa que gere um vetor de trs dimenses (X, Y e Z) em que cada posio guarda a soma de suas coordenadas. As dimenses da matriz devero ser determinadas em tempo de execuo e o programa dever informar os valores gerados. Soluo: vetor.c 3. Escreva um programa que leia uma frase de at 80 caracteres do teclado e imprima a frequncia com que aparece cada uma das letras do alfabeto na frase. Soluo: c8contac.c 4. Escreva um programa que leia uma frase de at 80 caracteres e a imprima em ordem reversa convertendo todos os caracteres minsculos para maisculos. Soluo: reverso.c 5. Escreva um programa que leia uma matriz e a imprima. O programa deve ler o numero de colunas e linhas do teclado. O programa deve ainda trocar duas linhas da matriz de posio. Os nmeros das linhas a serem trocadas devem ser lidos do teclado. Soluo: c8trolin.c

6. Escreva um programa que simule uma pilha usando vetores. O programa deve implementar as seguintes operaes na pilha: 1. Inserir. 2. Remover 3. Listar Soluo: c8pilha.c 7. Escreva uma funo que receba um ponteiro para uma string e troque todo o caracter aps um branco pelo seu equivalente maisculo. Soluo: c8maiu.c 8. Escreva um programa que leia seu nome completo e pergunte quantas letras tem o seu primeiro nome. Assuma que a letra 'a' tem ndice 0, a letra 'b' ndice 1 e assim por diante. O programa deve imprimir quantas letras iguais a letra cujo ndice o nmero de letras do seu primeiro nome existem no seu nome completo. Soluo: diga.c 9. Faa uma funo que verifique se a expresso apontada por substr est presente na cadeia apontada por str. A funo possui o prottipo abaixo:
int posicao(char *substr, char *str);

e retorna a posio em que a sub-cadeia aparece em cadeia. Soluo: procura.c 10. Escreva um programa que procure em uma matriz elementos que sejam ao mesmo tempo o maior da linha e o menor coluna. As dimenses da matriz devem ser pedidas ao usurio. Soluo: sela.c 11. Escreva um programa que leia duas cadeias de caracteres e concatene a segunda cadeia ao final da primeira. Soluo: concatena.c

ndice

elhores c inguagem c

orrespondncias p

ara o

peracoes c

om p

onteiros l

Oe

xemplo (c8incrp.c) a ... I rp

baixo m ara o t

ostra q exto

ue o

peraes d

ei

ncremento e

onteiros e V

etores e ome d eu

sto f mv

ortemente r etor

elacionados n ... I rp

al ara o t

inguagem C. O n exto

Você também pode gostar