You are on page 1of 14

UNIVERSIDADE FEDERAL DO OESTEDA BAHIA

INSTITUTO DE CINCIAS AMBIENTAIS E DESENVOLVIMENTO SUSTENTVEL


Disciplina: Metodologia da Programao

RODRIGO EMANUEL RODRIGUES DA SILVA

Trabalho computacional 3 Apostila


Ponteiros e Alocao dinmica de memria

ORIENTADOR: PROF. Dr. KENNEDY MORAIS FERNANDES


Barreiras-BA
Fevereiro de 2014

Sumrio
1 Ponteiros (com exemplos) .................................................................................................................. 3
1.1. Declarando Ponteiros ................................................................................................................... 3
1.2. Manipulao de Ponteiros ........................................................................................................... 4
1.3. Expresses com Ponteiros............................................................................................................ 4
1.4 Caractersticas e definio ............................................................................................................ 5
1.5 Ponteiros para ponteiros............................................................................................................... 5
2 Alocao Dinmica (com exemplos).............................................................................................. 9
Concluso .............................................................................................................................................. 13
Referncias ............................................................................................................................................ 14
1 Ponteiros

Os ponteiros so ferramentas cruciais no desenvolvimento de preogramas , e para a prpria


evoluo e facilitao dos comandos de programao, permitindo expandir as aplicaes dos
programas criados, no caso com a linguagem C.

Os ponteiros guardam o endereo (local na memria) da varivel qual faz referencia (podem
at mesmo fazer referencia a outro ponteiro).

Uma observao deve ser feita para se utilizar ponteiros em um programa:

No se pode utilizar o ponteiro sem antes lhe atribuir algum endereo, o ponteiro deve
ser inicializado antes!

uma varivel que contm o endereo de outra varivel. Os ponteiros so utilizados para
alocao dinmica, podendo substituir matrizes com mais eficincia. Tambm fornecem a
maneira pelas quais funes podem modificar os argumentos chamados, como
frequentemente visto no uso de funes.

Exemplo de Sintaxe de ponteiro:

tipo *nomevar;

O asterisco informa que o valor ser impresso e no um endereo.

1.1. Declarando Ponteiros

Se uma varivel ir conter um ponteiro, ento ela deve ser declarada como tal:

int x,*px;

px=&x; /*a varivel px aponta para x */

Se quisermos utilizar o contedo da varivel para qual o ponteiro aponta:

y=*px;

O que a mesma coisa que:

y=x;
1.2. Manipulao de Ponteiros

Desde que os ponteiros so variveis, eles podem ser manipulados como as variveis podem.
Se py um outro ponteiro para um inteiro ento podemos fazer a seguinte declarao:

py=px;

Exerccio 1:

main(){

int x,*px,*py;

x=9;

px=&x;

py=px;

printf("x= %d\n",x);

printf("&x= %d\n",&x);

printf("px= %d\n",px);

printf("*px= %d\n",*px);

printf("*px= %d\n",*px);

1.3. Expresses com Ponteiros

Os ponteiros podem aparecer em expresses, se px aponta para um inteiro x,

ento *px pode ser utilizado em qualquer lugar que x seria.

O operador * tem maior precedncia que as operaes aritmticas, assim a expresso abaixo
pega o contedo do endereo que px aponta e soma 1 ao seu contedo.

y=*px+1;

No prximo caso somente o ponteiro ser incrementado e o contedo da prxima posio da


memria ser atribudo a y:

y=*(px+1);

Os incrementos e decrementos dos endereos podem ser realizados com os operadores ++ e --


, que possuem procedncia sobre o * e operaes matemticas e
so avaliados da direita para a esquerda:

*px++; /* sob uma posio na memria */

*(px--); /* mesma coisa de *px-- */

No exemplo abaixo os parnteses so necessrios, pois sem eles px seria incrementado em vez
do contedo que apontado, porque os operadores * e ++ so avaliados da direita para
esquerda.

(*px)++ /* equivale a x=x+1; ou *px+=1 */

1.4 Caractersticas e definio

Em programao, um ponteiro ou apontador um tipo de dado de uma linguagem de


programao cujo valor se refere diretamente a um outro valor alocado em outra rea da
memria, atravs de seu endereo. Um ponteiro uma simples implementao do tipo
referncia.

1.5 Ponteiros para ponteiros

Um ponteiro para um ponteiro uma forma de indicao mltipla. Num ponteiro normal, o
valor do ponteiro o valor do endereo da varivel que contm o valor desejado. Nesse caso o
primeiro ponteiro contm o endereo do segundo, que aponta para a varivel que contm o
valor desejado. float **balano; balano um ponteiro para um ponteiro float.

Exerccio 2:

main()

{i

nt x,*p,**q;

x=10;

p=&x;

q=&p;
printf("%d",**q);

Quando passamos argumentos a uma funo, os valores fornecidos so copiados para as


variveis parmetros da funo. Este processo idntico a uma atribuio.

Este processo chamado de passagem por valor. Desta forma, alteraes nos parmetros
dentro da funo no alteram os valores que foram passados:

Exerccio 3

O que ser impresso?

#include <stdio.h>

int main(){

int a=3, b=2, *p = NULL, *q = NULL;

p = &a;

q = p;

*q = *q +1;

q = &b;

b = b + 1;

printf("%d\n", *q);

printf("%d\n", *p);

Exerccio 4

/* atravs dos ponteiros,imprime o valor atribudo a trs nmeros a,b e c . */

#include<stdio.h>
int main() {

int a, b, c;

int *pa, *pb, *pc;

a = 23;

b = 88;

c = 1;

pa = &a;

pb = &b;

pc = &c;

*pa = 1;

*pb = 23;

*pc = 88;

printf("Em ordem crescente: %d, %d, %d\n", a, b, c);

printf ("Em ordem decrescente: %d, %d, %d", c, b, a);

return 0;

Exerccio 5

Quais sero os valores de x, y e p ao final do trecho de cdigo abaixo?

int x, y, *p;

y = 0;

p = &y;

//*p = 0
x = *p;

//x = 0

x = 4;

//x = 4

(*p)++;

//*p = 1, y = 1

--x;

//x = 3

(*p) += x;

//*p = 4, y = 4

Ao final, temos:

x = 3, y = 4, p apontando para y (*p = 4).

Exerccio 6

Qual o resultado do cdigo abaixo? Explicaes em seguida...

int x = 100, *p, **pp;

p = &x;

pp = &p;

printf(Valor de pp: %d\n, **pp);

int x = 100, *p, **pp;

//x recebe o valor 100, p um ponteiro para inteiro e pp um ponteiro para ponteiro para
inteiro p = &x; //p passa a apontar para o endereo de x (logo, *p tem o valor 100) pp = &p;
//pp passa a apontar para o endereo de p, logo *pp o valor de pp, que o mesmo que p e
**pp o mesmo que *p, que o mesmo que x (que igual a 100) printf(Valor de pp: %d\n,
**pp); //imprime o valor de **pp, que igual ao valor de x, como mencionado na linha acima

2 Alocao Dinmica

H duas maneiras de armazenar variveis na memria do computador. Primeiro por


variveis globais e estaticas locais, segundo atravs de alocao dinmica, quando
o C armazena a informao em uma rea de memria livre, de acordo com a
necessidade. No caso do C standard, a alocao dinmica fica disponvel com a
incluso de stdio.h.
Em algumas situaes, porm, o usurio s tomar conhecimento da quantidade de
posies do vetor, durante o programa. Para lidar com esse tipo de situao, a
alocao de memria deve ser dinmica. Para isso, algumas funes sero
utilizadas:
malloc ou calloc: Alocam a memria que ser necessria;
free: Libera a memria alocada quando a mesma no for mais necessria.

Exerccio 1.

#include <stdio>
main()
{i
nt *p, t;
p=(int *) malloc(40*sizeof(int));
if (!p)
printf("memoria insuficiente\n");
else
{
for(t=0;t<40;++t) *(p+t)=t;
for(t=0;t<40;++t) printf("%d ",*(p+t));
free(p);
}
}

Exerccio 2:

#include <stdio>
main()
{i
nt i,quant;
float max,min,*p;
printf ("quantidade de numeros:\n");
scanf("%d",&quant);
if (!(p=(float*)malloc((quant+1)*sizeof(float))))
{
printf("sem memoria\n");
exit(1);
}
printf("digite %d numeros:\n",quant);
for (i=1;i<=quant;i++)
{
scanf("%f",(p+i));
}
max=*(p+1);
for (i=2;i<=quant;i++)
{
if (*(p+i)>=max)
max=*(p+i);
}
printf("maior e :%f\n",max);
free(p);
}

Exerccio 3

Escreva uma funo que recebe uma string de caracteres e uma letra e devolve um vetor de
inteiros contendo as posies (ndices no vetor da string) onde a letra foi encontrada) e um
inteiro contendo o tamanho do vetor criado (total de letras iguais encontradas). Utilize o
retorno de um vetor para retornar os ndices e um ponteiro para guardar o tamanho do vetor.

#include <stdio.h>

#include <stdlib.h>

int *acha_caractere(char *str, char c, int *pn) {

int i = 0, n = 0, *indices = 0;

for (i = 0; str[i] != '\0'; i++) {

if (str[i] == c) {

n++;

indices = (int *) malloc(n* sizeof(int));

for (i = 0, n = 0; str[i] != '\0'; i++) {

if (str[i] == c) {

indices[n] = i;

n++;

}
}

*pn = n;

return indices;

int main() {

int *indices = 0, n = 0, i;

char *frase = "teste";

indices = acha_caractere(frase, 'e', &n);

for (i = 0; i < n; i++) {

printf("%d ", indices[i]);

return 0;

Exerccio 4

Escrever um programa que l duas cadeias s1, s2, e retorna uma nova cadeia s3 que contm
todos os caracteres que aparecem em s1 e em s2.

char *caracteres_repetidos(char *s1, char *s2) {

int i, j, w, n = 0, encontrado;

char *s3;

//Primeiro vamos contar os caracteres repetidos para saber quantos sao:

for (i = 0; s1[i] != '\0'; i++) {

for (j = 0; s2[j] != '\0'; j++) {

if (s1[i] == s2[j]) {

n++;

break;

}
}

//Agora podemos alocar memoria para eles:

//Alocaremos n + 1 por causa do \0 no final!

s3 = malloc((n + 1) * sizeof(char));

n = 0;

//Vamos buscar novamente os caracteres repetidos:

for (i = 0; s1[i] != '\0'; i++) {

for (j = 0; s2[j] != '\0'; j++) {

if (s1[i] == s2[j]) { //Caractere encontrado nas duas strings!

//Vamos verificar se o caractere encontrado jah nao foi inserido em s3:

encontrado = 0;

for (w = 0; w < n; w++) {

if (s3[w] == s1[i]) {

encontrado = 1;

break;

if (encontrado == 0) { //Se nao foi encontrado, adiciona:

s3[n] = s1[i];

n++;

break;

s3[n] = '\0';
return s3;

Exerccio 5

Concluso
Neste trabalho, foram discutidas duas das funes mais importante no desenvolvimento de
programas em linguagem C: Alocao dinmica de memria e a utilizao de ponteiros,
foram vistos tambm exemplos de aplicao destes temas (incluindo o cdigo fonte).Estas
ferramentas facilitam muito a criao de novos tipos de programa e a simplificao de
cdigos existentes.

Referncias

o CARVALHO,Curso de programao em C - UFMG.

o INTRODUO A LINGUAGEM C - CENTRO DE COMPUTAO UNICAMP.

o Apostilas da disciplina.

You might also like