Professional Documents
Culture Documents
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 guardam o endereo (local na memria) da varivel qual faz referencia (podem
at mesmo fazer referencia a outro ponteiro).
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.
tipo *nomevar;
Se uma varivel ir conter um ponteiro, ento ela deve ser declarada como tal:
int x,*px;
y=*px;
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);
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;
y=*(px+1);
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.
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);
Este processo chamado de passagem por valor. Desta forma, alteraes nos parmetros
dentro da funo no alteram os valores que foram passados:
Exerccio 3
#include <stdio.h>
int main(){
p = &a;
q = p;
*q = *q +1;
q = &b;
b = b + 1;
printf("%d\n", *q);
printf("%d\n", *p);
Exerccio 4
#include<stdio.h>
int main() {
int a, b, c;
a = 23;
b = 88;
c = 1;
pa = &a;
pb = &b;
pc = &c;
*pa = 1;
*pb = 23;
*pc = 88;
return 0;
Exerccio 5
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:
Exerccio 6
p = &x;
pp = &p;
//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
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 i = 0, n = 0, *indices = 0;
if (str[i] == c) {
n++;
if (str[i] == c) {
indices[n] = i;
n++;
}
}
*pn = n;
return indices;
int main() {
int *indices = 0, n = 0, 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.
int i, j, w, n = 0, encontrado;
char *s3;
if (s1[i] == s2[j]) {
n++;
break;
}
}
s3 = malloc((n + 1) * sizeof(char));
n = 0;
encontrado = 0;
if (s3[w] == s1[i]) {
encontrado = 1;
break;
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 Apostilas da disciplina.