#include <iostream>
using namespace std;

// by pointer
void printAdressesPtr(int* p1, int* p2) {
	std::cout << "p1 - ptr: " << p1 << " - value: " << *p1 << std::endl;
	std::cout << "p2 - ptr: " << p2 << " - value: " << *p2 << std::endl;
	      
	// while now the addresses of p1 and p2 are different
    std::cout << "p1 - ptr adr: " << &p1 << std::endl;
    std::cout << "p2 - ptr adr: " << &p2 << std::endl;
}

// by reference
void printAdressesRef(int& r1, int& r2) {
	std::cout << "r1 - ref: " << &r1 << " - value: " << r1 << std::endl;
	std::cout << "r2 - ref: " << &r2 << " - value: " << r2 << std::endl;
}

// by value. this will not work, since values are copied.
void printAdressesVal(int v1, int v2) {
	std::cout << "v1 - ref: " << &v1 << " - value: " << v1 << std::endl;
	std::cout << "v2 - ref: " << &v2 << " - value: " << v2 << std::endl;
}

int main() {
	// your code goes here
	
	int* ptr1 = new int(123);
	int* ptr2 = ptr1;
	
	printAdressesPtr(ptr1, ptr2);
	printAdressesRef(*ptr1, *ptr2);
	printAdressesVal(*ptr1, *ptr2);
	
	return 0;
}