#include <iostream>

void modify_pointer_byvalue(const char* p)
{
    p = "by value";
}

void modify_pointer_byreference(const char*& p)
{
    p = "by reference";
}

void modify_pointer_byindirection(const char** p)
{
    *p = "by indirection";
}

int main()
{
    const char* ptr = "original";
    std::cout << "Before modification: \"" << ptr << "\"\n";

    modify_pointer_byvalue(ptr);
    std::cout << "After value: \"" << ptr << "\"\n";

    modify_pointer_byreference(ptr);
    std::cout << "After reference: \"" << ptr << "\"\n";

    modify_pointer_byindirection(&ptr);
    std::cout << "After indirection: \"" << ptr << "\"\n";
}