#include <iostream>

int value1 = 1;
int value2 = 2;

void func1(int *p) {
  p = &value2;
}

void func2(int **p) {
  *p = &value2;
}

int main(void) {
  std::cout << "The address of value1 is " << &value1 << std::endl;
  std::cout << "The address of value2 is " << &value2 << std::endl << std::endl;

  std::cout << "========== Case 1 ==========" << std::endl;
  int *ptr1 = &value1;
  int *temp1 = ptr1;
  std::cout << "\tptr1 = " << ptr1 << std::endl;
  func1(temp1);
  std::cout << "\tptr1 = " << ptr1 << std::endl << std::endl;

  std::cout << "========== Case 2 ==========" << std::endl;
  int *ptr2 = &value1;
  int **temp2 = &ptr2;
  std::cout << "\tptr2 = " << ptr2 << std::endl;
  func2(temp2);
  std::cout << "\tptr2 = " << ptr2 << std::endl;
}