How can i use operator overloading with pointer objects ?

For example, i have a class like this :

```
template <typename T>
class Array
{
    public:
        Array(size_t arrSize) : m_ArrSize(arrSize)
        {
            m_Arr = (T*)calloc(m_ArrSize,sizeof(T));
        }

        ~Array()
        {
            free(m_Arr);
        }

        void changeSize(size_t newSize)
        {
            m_ArrSize = newSize;

            m_Arr = (T*)realloc((void*)m_Arr,m_ArrSize*sizeof(T));
        }

        T& operator[](size_t index)
        {
            return m_Arr[index];
        }

        size_t size(){ return this->m_ArrSize; }
    private:
        Array(){}

        T* m_Arr = nullptr;
        size_t m_ArrSize;
};

```

And i want to use operator[] like this :

```
Array<int>* arr = new Array<int>(16);

arr[0] = 35;

```

How can i use this like this ?