So far to my understanding, when defining a pointer variable, we are allocating space in RAM for that variable.
int *p;  
Would define a space in RAM. Then we assign a memory address to that pointer using `&variable'.
I'm looking over at an example on: *this vs this in C++ The code is:
#include <iostream>
class Foo
{
    public:
        Foo()
        {
            this->value = 0;
        }
        Foo get_copy()
        {
            return *this;
        }
        Foo& get_copy_as_reference()
        {
            return *this;
        }
        Foo* get_pointer()
        {
            return this;
        }
        void increment()
        {
            this->value++;
        }
        void print_value()
        {
            std::cout << this->value << std::endl;
        }
    private:
        int value;
};
int main()
{
    Foo foo;
    foo.increment();
    foo.print_value();
    foo.get_copy().increment();
    foo.print_value();
    foo.get_copy_as_reference().increment();
    foo.print_value();
    foo.get_pointer()->increment();
    foo.print_value();
    return 0;
}
I don't understand what the purpose of putting the * operator in front Foo* get_copy() and Foo* get_pointer() does. Why do I get an error if I removed the * from the Foo* functions while returning this not *this?
edit:
Also, why is:
foo.get_copy().increment();
foo.print_value();
yielding 1 not 2?