



Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Este documento fornece uma introdução básica sobre o conceito de endereços e ponteiros em c/c++. O texto aborda a importância de dominar o conceito de ponteiro, como cada objeto na memória ocupa um número específico de bytes e possui um endereço. Além disso, são fornecidos exemplos práticos e explicações sobre como funcionam ponteiros, como declará-los, armazenar endereços de variáveis e realizar operações com eles.
Tipologia: Slides
1 / 6
Esta página não é visível na pré-visualização
Não perca as partes importantes!




Programação de Computadores I e Laboratório de Programação de Computadores I Graduação em Engenharia Elétrica - Profa. Rosana Massahud
Os conceitos de endereço e ponteiro são fundamentais em qualquer linguagem de programação, embora fiquem ocultos em algumas linguagens. Em C/C++, esses conceitos são explícitos. Dominar o conceito de ponteiro exige algum esforço e uma boa dose de prática.
A memória RAM de qualquer computador é uma sequência de bytes. Cada byte armazena um de 256 possíveis valores. Os bytes são numerados sequencialmente e o número de um byte é o seu endereço ( address ).
Cada objeto na memória do computador ocupa um certo número de bytes consecutivos. Um char ocupa 1 byte. Um int ocupa 4 bytes e um double ocupa 8 bytes em muitos computadores.
O número exato de bytes de um objeto é dado pelo operador sizeof. A expressão sizeof (int) , por exemplo, dá o número de bytes de um int no seu computador.
Cada objeto na memória tem um endereço. Na maioria dos computadores, o endereço de um objeto é o endereço do seu primeiro byte. Por exemplo, depois das declarações
char c; int i; double x; char d;
os endereços das variáveis poderiam ser os seguintes
c 2293327 i 2293328 x 2293332 d 2293340
O endereço de um objeto (como uma variável, por exemplo) é dado pelo operador &. Se i é uma variável então &i é o seu endereço. (Não confunda esse uso de & com o operador lógico and , que se escreve && em C/C++.) No exemplo anterior, &i vale 2293328 e &c vale 2293327.
Exemplo 1 :
#include
int main(){ cout << "Neste computador\n"; cout << "\nUm char ocupa " << sizeof(char) << " byte"; cout << "\nUm int ocupa " << sizeof(int) << " bytes"; cout << "\nUm float ocupa "<< sizeof(float) << " bytes"; cout << "\nUm double ocupa " << sizeof(double) << " bytes"; return 0; }
CEFET MG – Unidade Nepomuceno Programação de Computadores I e Laboratório de Programa Graduação em Engenharia Elétrica -
Exemplo 2 :
#include
int i; double x; cout << "Endereco de x return 0; }
Como funcionam os ponteiros
Os ints guardam inteiros. Os floats Ponteiros guardam endereços de memória. Quando você ano um ponteiro. O ponteiro é este seu pedaço de papel. Ele tem anotado um endereço. Qual é o sentido disto? Simples. Quando você anota o endereço de um colega, depois você vai usar este endereço para achá C funciona assim. Você anota o endereço de algo numa variável ponteiro para depois usar.
Da mesma maneira, uma agenda, onde são guardados endereços de vários amigos, poderia ser vista como sendo uma matriz de ponteiros no C
Um ponteiro também tem tipo. Vej diferente de quando você anota o endereço de uma firma. Apesar de o mesmo formato (rua, número, bairro, cidade, etc.) eles indicam locais cujos conteúdos são difer Então os dois endereços são ponteiros de tipos diferentes.
No C/C++ quando declaramos ponteiros nós informamos ao compilador para que tipo de variável vamos apontá-lo. Um ponteiro int aponta para um inteiro, isto é, guarda o endereço de um inteiro.
Um ponteiro (= apontador = pointer ponteiro pode ter o valor especial NULL que não é endereço de lugar algum. A constante NULL está definida na interface stdlib.h e seu valor é 0 na maioria dos com
Se um ponteiro p armazena o endereço de uma variável endereço de i ”. Em termos um pouco
Se um ponteiro p tem valor diferente de NULL então confunda esse uso de * com o operador de multiplicação!) então dizer *p é o mesmo que dizer
Unidade Nepomuceno Programação de Computadores I e Laboratório de Programação de Computadores I
cout << "Endereco de x: " << &x << endl;
guardam números de ponto flutuante. Os chars Ponteiros guardam endereços de memória. Quando você anota o endereço de um colega você está criando um ponteiro. O ponteiro é este seu pedaço de papel. Ele tem anotado um endereço. Qual é o sentido disto? Simples. Quando você anota o endereço de um colega, depois você vai usar este endereço para achá anota o endereço de algo numa variável ponteiro para depois usar.
Da mesma maneira, uma agenda, onde são guardados endereços de vários amigos, poderia ser vista como sendo uma matriz de ponteiros no C/C++.
. Veja: quando você anota um endereço de um amigo você o trata diferente de quando você anota o endereço de uma firma. Apesar de os endereço mesmo formato (rua, número, bairro, cidade, etc.) eles indicam locais cujos conteúdos são difer Então os dois endereços são ponteiros de tipos diferentes.
quando declaramos ponteiros nós informamos ao compilador para que tipo de variável vamos aponta para um inteiro, isto é, guarda o endereço de um inteiro.
pointer ) é um tipo especial de variável que armazena endereços ponteiro pode ter o valor especial NULL que não é endereço de lugar algum. A constante NULL está e seu valor é 0 na maioria dos computadores.
armazena o endereço de uma variável i, podemos dizer “ p aponta para Em termos um pouco mais técnicos, diz-se que “ p é uma referência à variável
tem valor diferente de NULL então *p é o valor do objeto apontado por confunda esse uso de * com o operador de multiplicação!). Por exemplo, se i é uma variável e é o mesmo que dizer i.
ção de Computadores I
chars guardam caracteres. ta o endereço de um colega você está criando um ponteiro. O ponteiro é este seu pedaço de papel. Ele tem anotado um endereço. Qual é o sentido disto? Simples. Quando você anota o endereço de um colega, depois você vai usar este endereço para achá-lo. O anota o endereço de algo numa variável ponteiro para depois usar.
Da mesma maneira, uma agenda, onde são guardados endereços de vários amigos, poderia ser vista como
a: quando você anota um endereço de um amigo você o trata endereços dos dois locais terem o mesmo formato (rua, número, bairro, cidade, etc.) eles indicam locais cujos conteúdos são diferentes.
quando declaramos ponteiros nós informamos ao compilador para que tipo de variável vamos aponta para um inteiro, isto é, guarda o endereço de um inteiro.
é um tipo especial de variável que armazena endereços. Um ponteiro pode ter o valor especial NULL que não é endereço de lugar algum. A constante NULL está
aponta para i ” ou “ p é o é uma referência à variável i ”.
é o valor do objeto apontado por p. (Não é uma variável e p vale &i
Programação de Computadores I e Laboratório de Programação de Computadores I Graduação em Engenharia Elétrica - Profa. Rosana Massahud
9 10 11 12 13 14 15
b = 9; p = &a; //p aponta para a r = &p; //r aponta para p e *r aponta para a c = **r + b; cout << **r << " + " << b << " = " << c << endl; return 0; }
Novamente, observe as impressões de maneira direta das variáveis b e c e indireta da variável a, na linha
As próximas operações, também muito usadas, são o incremento e o decremento. Quando incrementamos um ponteiro ele passa a apontar para o próximo valor do mesmo tipo para o qual o ponteiro aponta. Isto é, se temos um ponteiro para um inteiro e o incrementamos, ele passa a apontar para o próximo inteiro. Esta é mais uma razão pela qual o compilador precisa saber o tipo de um ponteiro: se você incrementa um ponteiro char * ele anda 1 byte na memória e se você incrementa um ponteiro double * ele anda 8 bytes na memória. O decremento funciona de modo semelhante.
Supondo que p é um ponteiro, as operações são escritas como: p++; p--;
Mais uma vez insisto. Estamos falando de operações com ponteiros e não de operações com o conteúdo das variáveis para as quais eles apontam. Por exemplo, para incrementar o conteúdo da variável apontada pelo ponteiro p, faz-se: (*p)++;
Outras operações aritméticas úteis são a soma e subtração de inteiros com ponteiros. Vamos supor que você queira incrementar um ponteiro de 15. Basta fazer: p=p+15; ou p+=15;
E se você quiser usar o conteúdo do ponteiro 15 posições adiante: *(p+15);
A subtração funciona da mesma maneira. Uma outra operação, às vezes útil, é a comparação entre dois ponteiros. Mas que informação recebemos quando comparamos dois ponteiros? Bem, em primeiro lugar, podemos saber se dois ponteiros são iguais ou diferentes (== e !=). No caso de operações do tipo >, <,
= e <= estamos comparando qual ponteiro aponta para uma posição mais alta na memória. Então uma comparação entre ponteiros pode nos dizer qual dos dois está "mais adiante" na memória. A comparação entre dois ponteiros se escreve como a comparação entre outras duas variáveis quaisquer: p1 > p p1 == p p1 != p p1 <= p ...
Há entretanto operações que você não pode efetuar num ponteiro. Você não pode dividir ou multiplicar ponteiros, adicionar dois ponteiros, adicionar ou subtrair floats ou doubles de ponteiros.
Programação de Computadores I e Laboratório de Programação de Computadores I Graduação em Engenharia Elétrica - Profa. Rosana Massahud
p++; (*p)++; *(p++);
O que quer dizer *(p+10);?
Explique o que você entendeu da comparação entre ponteiros
Qual o valor de y no final do programa? Tente primeiro descobrir e depois verifique no computador o resultado. A seguir, escreva um /* comentário */ em cada comando de atribuição explicando o que ele faz e o valor da variável à esquerda do '=' após sua execução.
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16
#include
int main() { int y, p, x; y = 0; p = &y; x = p; x = 4; (p)++; x--; (p) += x; cout << "y = " << y << endl; return 0; }
Em C++, com o operador de referência podemos montar novos tipos de dados chamados de referências.
Referência é um outro nome para uma variável já existente. As instruções: int n; int& A = n; informam que A é um outro nome para n.
Toda operação em qualquer um dos nomes tem o mesmo resultado. A referência não é uma cópia da variável a que se refere, é a mesma variável sob nomes diferentes.
Exemplo 5 :
#include
int main(){ int n; int& A = n; n = 5; cout << "A = " << A << endl; A = 8;