12. PONTEIRO
42 pág.

12. PONTEIRO


DisciplinaProgramacao Modular91 materiais1.043 seguidores
Pré-visualização3 páginas
BAC004 - Informática - Aulas Teóricas - Fabiana 
Costa Guedes
1
Ponteiros
BAC004 - Informática - Aulas Teóricas - Fabiana 
Costa Guedes
2
Ponteiros
\u25a0 Um ponteiro é um endereço de 
memória. 
\u25a0 Seu valor indica onde uma variável 
está armazenada, não o que está 
armazenado. 
\u25a0 Um ponteiro proporciona um modo de 
acesso a uma variável sem referenciá-
la diretamente.
3
Ponteiro
\u2022 O valor do ponteiro xPtr é o endereço da 
variável x que, por sua vez, contém o valor 10.0. 
\u2022 O nome de variável x referencia diretamente um 
valor, sendo que o ponteiro xPtr referencia 
indiretamente um valor. 
BAC004 - Informática - Aulas Teóricas - Fabiana 
Costa Guedes
4
Ponteiro
\u25a0 Os ponteiros são usados em situações em que o 
uso de uma variável é difícil ou indesejável. 
Algumas razões para o uso de ponteiros são: 
\u25cb Manipular elementos de matrizes; 
\u25cb Receber argumentos em procedimentos e funções que 
necessitem modificar o argumento original (passagem de 
parâmetros por referência); 
\u25cb Criar estruturas de dados complexas, como listas 
encadeadas e árvores binárias, onde um item deve conter 
referências a outro; 
\u25cb Alocar e desalocar memória do sistema.
BAC004 - Informática - Aulas Teóricas - Fabiana 
Costa Guedes
5
Ponteiro
\u25a0 A memória de um computador pode ser vista como 
uma enorme seqüência de bytes contíguos. 
\u25a0 Cada byte está localizado em um endereço da 
memória. O primeiro byte ocupa o endereço 0 da 
memória; o segundo byte fica no endereço 1 e 
assim sucessivamente. 
\u25a0 O endereço é, portanto, um número que indica a 
posição de um determinado byte na memória. 
\u25a0 A grandeza desse número varia de sistema para 
sistema.
BAC004 - Informática - Aulas Teóricas - Fabiana 
Costa Guedes
6
Ponteiro
\u25a0 Ao declarar uma variável, damos a ela um nome e um tipo. A partir 
dessas informações, o compilador é capaz de saber o número de 
bytes que a variável necessita ocupar na memória, de modo a conter 
qualquer um dos possíveis valores implicitamente especificados 
através do seu tipo. 
\u25a0 O compilador também sabe o endereço exato onde a variável se 
encontra, pois é ele mesmo que cuida de reservar o espaço 
necessário. 
\u25a0 O endereço de uma variável que ocupa mais de um byte na memória 
é o endereço do seu primeiro byte. Quando o nome da variável 
aparece posteriormente em algum comando, o compilador sabe gerar 
o código necessário para localizar a variável, seja para guardar nela 
algum valor, seja para ler o seu valor corrente. 
\u25a0 Dessa forma um ponteiro é uma variável cujo conteúdo é um 
endereço de memória. Ao invés de conter o próprio dado, um ponteiro 
contém o endereço do dado.
BAC004 - Informática - Aulas Teóricas - Fabiana 
Costa Guedes
7
Ponteiro \u2013 Declaração de 
Ponteiros
\u25a0 A declaração de um tipo ponteiro requer o 
uso do símbolo * seguido de um 
identificador. 
\u25a0 Esse identificador é o chamado tipo base, 
cuja área será alocada dinamicamente. Por 
exemplo: 
 int *P; 
\u25a0 A variável P é um ponteiro para um inteiro. 
Uma referência à variável P é uma 
referência ao seu conteúdo, ou seja, a um 
endereço.
8
Ponteiro - Operadores
\u25a0 & - operador de endereço: obtém o 
endereço na memória de uma variável; 
\u25a0 * - operador de indireção, também 
chamado de derreferência: obtém o 
valor da variável apontada.
9
Ponteiro
10
Ponteiro
11
Ponteiro
#include <iostream> 
using namespace std; 
int main() { 
float x; // x é uma variável do tipo float 
float *xPtr; // xPtr é um ponteiro para um float 
x = 10.0; 
xPtr = &x; // xPtr recebe o endereço de x 
cout << &quot;O valor de x e: &quot; << x << endl; 
cout << &quot;O endereco de x e: &quot; << &x << endl; 
cout << &quot;O valor de xPtr e: &quot; << xPtr << &quot; que e o mesmo endereco de x&quot;<< endl; 
cout << &quot;O valor de *Ptr e &quot; << *xPtr << &quot; que e o mesmo valor de x&quot; << endl; 
cout << &quot;O endereco de xPtr e: &quot; << &xPtr << endl; 
return 0; } 
12
Inicialização de Ponteiros
\u25a0 Com o valor 0 ou a constante NULL: não aponta para 
nada. Em C++ é preferível usar a constante 0. 
int *x = 0; int *y = NULL; 
\u25a0 Com algum endereço de memória de uma variável já 
existente. 
int a = 10; 
int *x = &a; 
\u25a0 Com a atribuição de um endereço de memória retornado 
pelo comando new() de alocação dinâmica de memória. 
int *y = new int();
BAC004 - Informática - Aulas Teóricas - Fabiana 
Costa Guedes
13
Ponteiros \u2013 Constante NULL
 int *P; 
 P = NULL; 
\u25a0 Pode-se atribuir NULL a 
qualquer ponteiro, e também 
podemos testar se um ponteiro é 
igual ou diferente de NULL.
BAC004 - Informática - Aulas Teóricas - Fabiana 
Costa Guedes
14
Ponteiros - O operador de 
endereços & - Exemplo
/* ProgC046 - Programa para exemplo do operador de 
endereço & */ 
#include <iostream> 
int main() { 
 int *P, I; 
 I = 10; 
 P = &I; 
 std::cout << *P << &quot;\n&quot;; 
 system (&quot;pause&quot;); 
 return 0; 
}
Declaração de um ponteiro 
de inteiros.
P recebe o endereço de I, ou 
seja, P \u201caponta\u201d para I.
Apresentação do valor de P, que 
será o mesmo de I, ou seja, 10.
15
Ponteiro - Passagem de 
Parâmetro
\u25a0 Ponteiros na chamada por referência 
podem ser usados para modificar uma ou 
mais variáveis da função chamadora, ou 
para evitar sobrecarga através da 
passagem por valor de dados grandes. 
\u25a0 Quando se chama uma função com 
parâmetros que devem ser modificados, 
os endereços dos parâmetros devem ser 
passados.
16
Ponteiro - Passagem de 
Parâmetro
/* funcao troca */ 
#include <iostream> 
void troca (int *px, int *py ) 
{ 
 int temp; 
 temp = *px; 
 *px = *py; 
 *py = temp; 
} 
int main () 
{ 
 int a = 5, b = 7; 
 troca(&a, &b); 
 std::cout << &quot;a: &quot;<< a << &quot; b: &quot; << b << &quot;\n&quot;; 
 return 0; 
} 
17
Ponteiro - Passagem de 
Parâmetro
BAC004 - Informática - Aulas Teóricas - Fabiana 
Costa Guedes
18
Operações com Ponteiros
\u25a0 C++ permite várias operações básicas 
com ponteiros. 
\u25a0 O próximo exemplo imprime os 
resultados de cada operação, o valor 
do ponteiro, o valor da variável 
apontada e o endereço do próprio 
ponteiro.
BAC004 - Informática - Aulas Teóricas - Fabiana 
Costa Guedes
19
Operações com Ponteiros - 
Exemplo
/* ProgC047 - Programa que apresenta as 
operações com ponteiros */ 
#include <iostream> 
int main(){ 
 int A=5, B=6; 
 int *ptrA, *ptrB; 
 ptrA = &A; 
 ptrB = &B; 
 if (ptrA < ptrB) 
 std::cout << &quot;\nptrB-ptrA= &quot; << (ptrB-
ptrA); 
 else 
 std::cout << &quot;\nptrA-ptrB= &quot; << (ptrA-
ptrB); 
 std::cout << &quot;\nptrA = &quot; << ptrA << &quot;, 
*nptrA = &quot; << *ptrA << 
 &quot;, &nptrA = &quot; << &ptrA;
std::cout << &quot;\nptrB = &quot; << ptrB << &quot;, 
*nptrB = &quot; << *ptrB << 
 &quot;, &nptrB = &quot; << &ptrB; 
 ptrB++; 
 std::cout << &quot;\nptrB = &quot; << ptrB << &quot;, 
*nptrB = &quot; << *ptrB << 
 &quot;, &nptrB = &quot; << &ptrB; 
 ptrA = ptrB + 3; 
 std::cout << &quot;\nptrA = &quot; << ptrA << &quot;, 
*nptrA = &quot; << *ptrA << 
 &quot;, &nptrA = &quot; << &ptrA << &quot;\n
\n&quot;; 
 system (&quot;pause&quot;); 
 return 0; 
}
BAC004 - Informática - Aulas Teóricas - Fabiana 
Costa Guedes
20
Operações com Ponteiros
\u25a0 É possível incrementar (ou decrementar) um ponteiro por meio de adição (ou 
subtração) regular ou dos operadores de incremento e decremento. 
\u25a0 Incrementar um ponteiro acarreta sua movimentação para o próximo tipo 
apontado; isto é, se ptrA é um ponteiro para uma variável int, depois de 
executar a instrução: 
 ptrA++; 
\u25a0 o valor de ptrA será incrementado de um int (4 bytes). Cada vez que ptrA for 
incrementada, apontará para o próximo int da memória. 
\u25a0 Também é possível somar ou subtrair números inteiros a variáveis ponteiros. A 
instrução: 
 ptrA = ptrB + 3; 
\u25a0 fará com que ptrB caminhe 3 inteiros adiante de ptrA.