Você está na página 1de 11

Passo 2 (Equipe)

1. Fazer a proposta do Captulo 3 Ponteiros, que deve conter pelo


menos cinco pginas, explicando os conceitos estudados a
respeito de ponteiros.
Captulo 3 Ponteiros

Definio de Ponteiros
Ponteiros so variveis que armazenam endereos de memria que contm
dados de determinados tipos.
Fazendo uma analogia, como se fosse um papel onde voc anota o
numero de telefone de uma pessoa, este papel seria o ponteiro e o numero
do telefone seria o endereo de memria. J uma agenda no lugar do papel
poderia ser vista como uma matriz de ponteiros, pois armazena vrios
nmeros de telefone.
Declarando os Ponteiros
Para se declarar um ponteiro, utilizamos quase mesma forma de como se
declara uma varivel, entretanto antes do nome do ponteiro colocamos o
operador asterisco (*). Veja no exemplo abaixo duas maneiras distintas de
se declarar ponteiros:
1
2
3
4
5
6
7
8
9

#include <iostream>
using namespace std;
int main()
{
int *ponteiro1;
int* ponteiro2;
}

Note que o asterisco no precisa obrigatoriamente estar junto ao nome do


ponteiro, o importante ele estar entre o tipo da varivel.
Normalmente ponteiros so declarados com a letra p antes do seu nome.
Tambm podemos utilizar o operador asterisco para atribuir valores
diretamente aos ponteiros:
1

*ponteiro1 = 100;

E para imprimir seu valor:

cout << *ponteiro1;

Caso voc no utilize o operador asterisco, o programa ir imprimir na tela o


endereo de memria para onde o ponteiro aponta:
1

cout << ponteiro1;

Existe um segundo operador essencial utilizado em ponteiros que o E


comercial. Ele serve para atribuir endereos de memria aos ponteiros, no
caso da linha de cdigo abaixo, o ponteiro ponteiro1 est recebendo o
endereo de memria da varivel variavel1:
1

ponteiro1 = &variavel1;

No cdigo abaixo podemos notar todos os exemplos de antes citados


aplicados na prtica:
1
2
3
4
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

#include <iostream>
using namespace std;
int main()
{
int *ponteiro1; //declarao do ponteiro
int variavel1;
ponteiro1 = &variavel1; //atribuindo ao ponteiro o endereo de
//memria da varivel
*ponteiro1 = 100; //atribuindo um valor atravs do ponteiro
cout <<
cout <<
cout <<
cout <<
cout <<
cout <<
cout <<
<< ponteiro1;

"\n--------------------------------";
"\nValor do ponteiro1: " << *ponteiro1;
"\n--------------------------------";
"\nEndereco de memoria do ponteiro1: " << &ponteiro1;
"\nEndereco de memoria da variavel1: " << &variavel1;
"\n--------------------------------";
"\nEndereco de memoria para onde o ponteiro1 aponta: "

Sada do programa:

importante salientar que toda atribuio de ponteiros deve ser do mesmo


tipo, voc no pode declarar um ponteiro do tipo double e atribuir a ele
um endereo de memria de uma varivel do tipo int, a no ser que voc
utilize o cast.
Cast
O cast uma converso para valores de tipos similares (int e double,
double e float, float e int, etc).
Convertendo uma varivel com o cast:
1
2
3
4

int *ponteiro1;
double variavel1;
ponteiro1 = (int *)&variavel1;

No entanto, o cast no recomendado, porque nem sempre a converso


feita com 100% de sucesso, resultando em um programa falho.

Incremento e Decremento
Operaes de incremento e decremento tambm so possveis com
ponteiros, os operadores so: ++ para incremento e -- decremento. Essas
operaes servem tanto para valores quanto endereos de memrias.
Os valores dos ponteiros so incrementados e decrementados de um em
um. J os endereos de memria dos ponteiros so incrementados e
decrementados conforme o tamanho do tipo da varivel, por exemplo, se
uma varivel for do tipo double, o ponteiro ser incrementado e
decrementado de 8 em 8. Veja no exemplo abaixo:

1
2
3
4
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

#include<iostream>
using namespace std;
int main()
{
double *ponteiro1;
double variavel1;
ponteiro1= &variavel1;
*ponteiro1= 200.2;
cout<< "Valor do ponteiro antes das alteracoes: " << *ponteiro1;
(*ponteiro1)++;
cout<< "\nValor do ponteiro apos o incremento:" << *ponteiro1;
(*ponteiro1)--;
cout<< "\nValor do ponteiro apos o decremento:" << *ponteiro1;
cout<< "\nEndereco de memoria do ponteiro antes das alteracoes:
" << ponteiro1;
ponteiro1++;
cout<< "\nEndereco de memoria do ponteiro apos o incremento: "
<< ponteiro1;
ponteiro1--;
cout<< "\nEndereco de memoria do ponteiro apos o decremento:" <<
ponteiro1;
}

Sada do programa:

Comparao de ponteiros
Para se comparar ponteiros, primeiramente eles tm que ser do mesmo
tipo, depois se utilizam os operadores: maior, maior ou igual, menor, menor
ou igual, igual e diferente.

1
2
3
4
5
6

cout
cout
cout
cout
cout
cout

<<
<<
<<
<<
<<
<<

(ponteiro1 > ponteiro 2) << endl; // maior


(ponteiro1 >= ponteiro 2) << endl; // maior ou igual
(ponteiro 1 < ponteiro 2) << endl; // menor
(ponteiro1 <= ponteiro 2) << endl; // menor ou igual
(ponteiro 1 == ponteiro 2) << endl; // igual
(ponteiro 1 != ponteiro 2) << endl; // diferente

Na sada do programa se o resultado for 1 porque o argumento


verdadeiro e se for 0 porque falso.
A grande vantagem em utilizar a comparao de ponteiros, que com ele
possvel saber se o endereo do ponteiro igual, se est mais ou menos
avanado que o endereo que est sendo comparado.

Ponteiros de Vetor
Um destaque para os ponteiros de vetor, que no necessrio colocar o
operador asterisco para atribuies:
1

ponteiro1 = variavel1;

Caso seja um vetor de char, possvel atribuir diretamente ao ponteiro sem


a necessidade de colocar por posies de memrias:
1
2
3
4
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

#include<iostream>
#include<strings.h>
using namespace std;
int main()
{
char vetor1[50];
char *ponteiro1;
strcpy(vetor1, "Este e o primeiro texto");
ponteiro1= vetor1;
cout << "Texto no vetor: " << vetor1;
cout << "\nTexto no ponteiro: " << ponteiro1;
cout << "\n\nSobrescrevendo o texto... \n";
ponteiro1 = (char*)"Este e o segundo texto";
cout << "\nTexto no ponteiro: " << ponteiro1;
cout << "\nTexto na posicao 0 do vetor: " << vetor1[0];
cout << "\nTexto na posicao 0 do ponteiro: " << *(ponteiro1+0);
}

Operadores bit-a-bit
O C++ possui 6 operadores bit-a-bit. Estes operadores operam somente em
dados do tipo char ou int. Com os operadores bit-a-bit podemos alterar

diretamente os bits de dados, o que tambm possibilita de certa forma uma


criptografia para o cdigo.
Na tabela a seguir esto os operadores com suas descries:
Operad
or

Descrio

&
|
^
~
>>

AND
OR
OR Exclusivo (XOR)
Negao
Deslocamento de bit a
direita
Deslocamento de bit a
esquerda

<<

Tabela verdade dos operadores bit-a-bit:


Operador AND (&):
p
0
0
1
1

q
0
1
0
1

p&q
0
0
0
1

Operador OR (|):
p
0
0
1
1

q
0
1
0
1

p|q
0
1
1
1

Operador XOR (^):


p
0
0
1
1

q
0
1
0
1

p&q
0
1
1
0

Para inverter o resultado, basta utilizar o operador NOT (~).


No programa abaixo, utilizaremos os operadores de AND, OR, XOR e NOT.
Alm disso, tambm utilizaremos o comando itoa, que serve para mostrar
os valores em uma base desejada utilizando em conjunto com um vetor de
char, assim voc poder ver como o valor ficar convertido, e no caso do
exemplo abaixo a base selecionada foi binria:

1
2
3
4
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

#include<iostream>
#include<strings.h>
#include<stdlib.h>
using namespace std;
int main()
{
int *ponteiro1, *ponteiro2;
int variavel1, variavel2;
char vetor_de_char[100];
ponteiro1 = &variavel1;
ponteiro2 = &variavel2;
variavel1 = 100;
variavel2 = 200;
itoa(*ponteiro1, vetor_de_char, 2);
cout<< "Valor do ponteiro1 em binario: " << vetor_de_char;
itoa(*ponteiro2, vetor_de_char, 2);
cout<< "\nValor do ponteiro2 em binario: " << vetor_de_char;
itoa(*ponteiro2 & *ponteiro1, vetor_de_char, 2);
cout<< "\nOperador AND: " << vetor_de_char;
itoa(*ponteiro2 | *ponteiro1, vetor_de_char, 2);
cout<< "\nOperador OR: " << vetor_de_char;
itoa(*ponteiro2 ^ *ponteiro1, vetor_de_char, 2);
cout<< "\nOperador XOR: " << vetor_de_char;
itoa(~*ponteiro2, vetor_de_char, 2);
cout<< "\nOperador NOT: " << vetor_de_char;
}

Sada do programa:

Para deslocar os bits tanto para a direita, quanto para a esquerda, basta
utilizar os operadores: << e >>. Veja o exemplo abaixo onde

deslocado 1 bit do ponteiro1 para a esquerda e 1 bit do ponteiro2 para a


direita:
1
2
3
4
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
int *ponteiro1, *ponteiro2;
int variavel1, variavel2;
ponteiro1 = &variavel1;
ponteiro2 = &variavel2;
variavel1 = 100;
variavel2 = 200;
*ponteiro1 = *ponteiro1 << 1;
cout << *ponteiro1 << endl;
*ponteiro1 = *ponteiro1 >> 1;
cout << *ponteiro1 << endl;
}

Sada do programa:

2. Fazer a proposta dos problemas, no formato de exerccios, que


devero ser distribudos da seguinte forma:

Dois problemas para tratar ponteiros.

Problema n 1 - Faa um programa que utilize ponteiros para fazer a troca


de dois valores.

Problema n 2 - Faa um programa que o usurio entre com o valor e


selecione o sentido e a quantidade de casas de bits que sero deslocados.

Passo 3 (Equipe)
1. Fazer a implementao, em Linguagem C+
+, de dois problemas propostos, colocando
no captulo o problema implementado e a
sada do programa.
Problema n 1 - Faa um programa que utilize ponteiros para fazer a troca
de dois valores.
Cdigo do programa:
1
2
3
4
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

#include <iostream>
using namespace std;
void troca(int *p, int *q);
int main ()
{
int *i, *j;
int a = 10, b = 20;
i = &a;
j = &b;
cout << "Valor de i antes da troca = " << *i << "\nValor de j
antes da troca = " << *j;
troca(i,j);
}
void troca(int *p, int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
cout << "\n\nValor de i apos a troca = " << *p << "\nValor de j
apos a troca = " << *q;
}

Sada do programa:

Problema n 2 - Faa um programa que o usurio entre com o valor e


selecione o sentido e a quantidade de casas de bits que sero deslocados.
Cdigo do programa:
1
2
3
4
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

#include<iostream>
using namespace std;
int main()
{
int *ponteiro1, *ponteiro2;
int variavel1, variavel2, casas, lado;
ponteiro1 = &variavel1;
ponteiro2 = &variavel2;
cout << "Digite o valor do ponteiro \nR: ";
cin >> variavel1;
cout << "\nPara qual lado voce deseja deslocar os bits?";
cout << "\n1 - Direita \n2 - Esquerda \nR: ";
cin >> lado;
cout << "\nQuantas casas voce deseja deslocar? \nR: ";
cin >> casas;
if (lado == 1)
{
*ponteiro1 = *ponteiro1 >> casas;
}
if (lado == 2)
{
*ponteiro1 = *ponteiro1 << casas;
}
cout << "Valor do ponteiro deslocado: " << *ponteiro1;
}

Sada do programa: