/*
 * enderecos.cpp
 *
 *  Created on: Apr 19, 2009
 *      Author: blabos
 */
#include <stdio.h>

int main(int argc, char** argv) {
    (void)argc;
    (void)argv;
    
    // Aqui eu escolhi utilizar printf por ser mais simples formatar a
	// saída conforme minha vontade. Misturar printf e cout é feio, na
	// minha opinião...
    printf("\nEndereços de ponteiros:\n\n");
    
	int a, b;
	int *pa, *pb;
	
	printf("Antes de qualquer atribuição:\n");
	
	printf("&a  = %p\n", &a); // Endereço válido dado pelo SO.
	printf("&b  = %p\n", &b); // Endereço válido dado pelo SO.
	printf("&pa = %p\n", &pa);// Endereço válido dado pelo SO.
	printf("&pb = %p\n", &pb);// Endereço válido dado pelo SO.
	
	printf("\n");
	
	printf("a   = %d\n", a);  // Conteúdo não inicializado (aleatório).
	printf("b   = %d\n", b);  // Conteúdo não inicializado (aleatório).
	printf("pa  = %p\n", pa); // Conteúdo não inicializado (aleatório).
	printf("pb  = %p\n", pb); // Conteúdo não inicializado (aleatório).
	
	// Tente descomentar as linhas abaixo, recompilar e rodar.
	//printf("*pa  = %d\n", *pa); // O que será (*aleatório)?
	//printf("*pb  = %d\n", *pb); // O que será (*aleatório)?
	
	printf("\nApós as inicializações dos ponteiros:\n");
	
	pa = &a;
	pb = &b;
	
	printf("&a  = %p\n", &a); // Mesmo endereço válido dado pelo SO.
	printf("&b  = %p\n", &b); // Mesmo endereço válido dado pelo SO.
	printf("&pa = %p\n", &pa);// Mesmo endereço válido dado pelo SO.
	printf("&pb = %p\n", &pb);// Mesmo endereço válido dado pelo SO.
	
	printf("\n");
	
	printf("a   = %d\n", a);  // Conteúdo não inicializado (aleatório).
	printf("b   = %d\n", b);  // Conteúdo não inicializado (aleatório).
	printf("pa  = %p\n", pa); // Conteúdo inicializado (&a).
	printf("pb  = %p\n", pb); // Conteúdo inicializado (&b).
	
	printf("*pa = %d\n", *pa);// Conteúdo apontado por pa (*pa == a).
	printf("*pb = %d\n", *pb);// Conteúdo apontado por pb (*pb == b).
	
	printf("\nApós as inicializações dos inteiros:\n");
	
	a = 10;
	b = 13;
	
	printf("&a  = %p\n", &a); // Mesmo endereço válido dado pelo SO.
	printf("&b  = %p\n", &b); // Mesmo endereço válido dado pelo SO.
	printf("&pa = %p\n", &pa);// Mesmo endereço válido dado pelo SO.
	printf("&pb = %p\n", &pb);// Mesmo endereço válido dado pelo SO.
	
	printf("\n");
	
	printf("a   = %d\n", a);  // Conteúdo inicializado (10).
	printf("b   = %d\n", b);  // Conteúdo inicializado (13).
	printf("pa  = %p\n", pa); // Conteúdo inicializado (&a).
	printf("pb  = %p\n", pb); // Conteúdo inicializado (&b).
	
	printf("*pa = %d\n", *pa);// Conteúdo apontado por pa (*pa == a == 10).
	printf("*pb = %d\n", *pb);// Conteúdo apontado por pb (*pb == b == 13).
	
	printf("\nAlterando os valores através dos ponteiros:\n");
	
	*pa = 7;
	*pb = 42;
	
	printf("&a  = %p\n", &a); // Mesmo endereço válido dado pelo SO.
	printf("&b  = %p\n", &b); // Mesmo endereço válido dado pelo SO.
	printf("&pa = %p\n", &pa);// Mesmo endereço válido dado pelo SO.
	printf("&pb = %p\n", &pb);// Mesmo endereço válido dado pelo SO.
	
	printf("\n");
	
	printf("a   = %d\n", a);  // Conteúdo inicializado (a == *pa ==  7).
	printf("b   = %d\n", b);  // Conteúdo inicializado (b == *pb == 42).
	printf("pa  = %p\n", pa); // Conteúdo inicializado (&a).
	printf("pb  = %p\n", pb); // Conteúdo inicializado (&b).
	
	printf("*pa = %d\n", *pa);// Conteúdo apontado por pa ( 7).
	printf("*pb = %d\n", *pb);// Conteúdo apontado por pb (42).
	
    return 0;
}

