Baixe o app para aproveitar ainda mais
Prévia do material em texto
Ponteiros em C Preliminares Para entender bem como os ponteiros funcionam precisamos saber que todos os programas que funcionam em um computador convencional têm que estar “carregados” na memória principal da máquina, conhecida como memória RAM (Random Access Memory) WINDOWS WORD EXCEL JOGO Memória RAM DE 4Gb preenchida com alguns exemplos de programas num determinado momento Endereço 0 Endereço 4Gb Preliminares Uma memória de um computador tem que ser vista como uma grande matriz onde cada posição é identificada por um endereço onde um byte pode ser armazenado WINDOWS WORD EXCEL JOGO Endereço 0 Endereço 1 Preliminares Todo programa é composto por uma área de código e outra de dados, normalmente representada por suas variáveis Quando um programa é executado, toda a parte de código deve ser posta em posições na memória, e cada variável da aplicação deve ser associada a um endereço de memória único Desta forma, atribuir um valor a uma variável significa guardar um valor no endereço de memória associado àquela variável Preliminares Por exemplo: int x = 10; Um programa com esta linha de código, quando executado geraria algo que poderia ser visualizado assim na memória: 10 X End.: 100 Memória RAM, assumindo que a variável “x” está no endereço 100 O que é um ponteiro? Ponteiro ou Apontador é uma variável simples como outra qualquer mas que tem a peculiaridade de que os valores que elas manipulam são endereços de memória de outros valores Em C, um ponteiro pode ser definido com o uso do operador de indireção representado por um asterisco Ex.: int *x; O que é um ponteiro? No exemplo dado, temos uma variável do tipo ponteiro que é capaz de armazenar como valores, endereços de memória de outros valores 500 X End.: 100 Memória RAM, assumindo que a variável “x” está no endereço 100 e no exemplo, para a configuração de memória abaixo, ela tem como valor o endereço de memória 10, que por sua vez contém o valor 5 5 End.: 500 O que é um ponteiro? Para este exemplo podemos ter as seguintes referências à variável “x”: cout << x; • Escreve o valor 500 cout << &x; • Escreve o endereço de memória de x, que é 100 cout << *x; • Escreve na tela o valor que está guardado no endereço de memória que é o valor de “x”, ou seja, o valor que é escrito é 5. O que é um ponteiro? Exemplo: #include <iostream> using namespace std; main() { int x = 10, *px; px = &x // Atribuição do endereço de “x” a “px” cout << *px; // Escreve 10 } 10 X End.: 100 NULL px End.: 200 Memória com a declaração das variáveis O que é um ponteiro? Exemplo: #include <iostream> using namespace std; main() { int x = 10, *px; px = &x // Atribuição do endereço de “x” a “px” cout << *px; // Escreve 10 } 10 X End.: 100 100 px End.: 200 Memória com após a atribuição px = &x Exemplos #include <iostream> using namespace std; main () { int num,valor; int *p; num=55; p=# /* Pega o endereco de num */ valor=*p; /* Valor é igualado a num de uma maneira indireta */ cout << valor; cout << “Endereco para onde o ponteiro aponta:”<<p; cout << "Valor da variavel apontada:“<<*p; } Exemplos #include <iostream> using namespace std; main () { int num,*p; num=55; p=# /* Pega o endereço de num */ cout <<"Valor inicial: “<<num; *p=100; /* Muda o valor de num de uma maneira indireta */ cout <<Valor final: “<<num; } Exemplos #include <iostream> using namespace std; main () { int num,*p1, *p2; num=55; p1=# /* Pega o endereco de num */ p2=p1; /*p2 passa a apontar para o mesmo endereço apontado por p1 */ cout<<“Conteúdo de p1: ”<<p1<<endl; cout<<“Valor apontado por p1: ”<<*p1<<endl; cout<<“Conteúdo de p2: ”<<p2<<endl; cout<<“Valor apontado por p2: ”<<*p2<<endl; } Exercícios Implemente um programa em C que preencha três variáveis com valores fornecidos como entrada pelo usuário, altere os mesmos multiplicando cada um deles, respectivamente, por 2,3 e 4, e acessando os seus valores através de ponteiros Resolução #include <iostream> using namespace std; main () { int a, b, c, *p1, *p2, *p3; cout << “Digite 3 valores:”; cin >> a>> b >> c; p1=&a; p2=&b; p3=&c; *p1 = *p1 * 2; *p2 = *p2 * 3; *p3 = *p3 * 4; cout<<a << b << c; } Operações com Ponteiros É possível incrementarmos ou decrementarmos os valores (endereços) de variáveis do tipo ponteiro Ex.: main() { int x = 10, *px; px = &x; px++; } 10 X End.: 100 NULL px End.: 200 Memória após a declaração Operações com Ponteiros Ex.: main() { int x = 10, *px; px = &x; px++; } 10 X End.: 100 100 px End.: 200 Memória após a atribuição Operações com Ponteiros Com o incremento, o valor da variável “px” passa a ser o valor atual (200) mais a quantidade de bytes ocupada por um número inteiro (4 bytes). O valor passa a ser 104 Ex.: main() { int x = 10, *px; px = &x; px++; } 10 X End.: 100 104 px End.: 200 Memória após a declaração Vetores como Ponteiros Em C, quando referenciamos um vetor sem seus colchetes, estamos referenciando seu endereço de memória Ex.: main() { int v[5] = {1,2,3,4,5} cout << v; // Escreve o valor 100 cout &v[0]; // Escreve o valor 100 cout &v[3]; // Escreve o valor 106 } 1 V -> End. Inicial: 100 100 102 104 106 108 Memória 5 4 3 2 Exemplos de Vetores com Ponteiros #include <iomanip.h> main () { int vet [4]; int *p; p=vet; for (int count=0;count<4;count++) { *p=0; p++; } for (int i=0;i<4;i++) { cout<<vet[i]<<" - "; } } Ponteiros e Funções Os parâmetros enviados para funções em C funcionam de uma forma que, se alterados dentro da função, não provocarão mudanças nos valores que foram enviados como parâmetros. Por exemplo: #include <iomanip.h> void func(int x){ x=x+10; } main(){ int a = 5; func(a); cout << a; // Que valor é escrito? } Ponteiros e Funções O valor de “a” não sofre qualquer alteração, mesmo “x” tendo sido alterado dentro da função “func”. Este processo é chamado de passagem de parâmetros “Por Valor” é o processo padrão definido em C Se desejarmos que o valor de “a” possa ser alterado, teremos que usar ponteiros, como mostrado no exemplo a seguir: Ponteiros e Funções #include <iomanip.h> void func(int *x) { *x=*x+10; } main() { int a = 5; func(&a); cout << a; // Que valor é escrito? } Ponteiros e Funções No exemplo dado, o valor escrito será 15, porque a alteração ocorre no valor da variável “a” indiretamente através do uso do ponteiro Este processo de passagem de parâmetros é chamado de passagem “Por Referência” Ponteiros e Registros É possível também criar ponteiros que guardam endereços de variáveis do tipo registro #include <iomanip.h> main() {struct reg{ int a,b; } r, *pr; r.a = 10; r.b = 20; pr = &r; cout << pr->a << " – " << pr->b; }
Compartilhar