Q:

Why do I return a series of a chars for a pointer return type?

I am trying my best to return a pointer with a specific value. Though, I am not understanding why I am getting more chars than usual. I asked a few people and I was told that I am getting a substring? 
Problem: I type in the word hotdog.
I expect to return a pointer at the index[2]. Though instead, I get the chars dog. Why is that? How would I get just index[2]? I am thinking about dereferencing it, but I am having problems in getting the return type to work.
I cannot change the return type or parameters for my function.
#include <iostream>

char * GetValueAtIndex(char * const c, int index);
void ReadString(char * c, int length);

int main()

{
    const int size = 10;
    char ma[size];
    char * pointer = ma;

    ReadString(ma, 20);
    std::cout << GetValueAtIndex(pointer, 3) << std::endl;
    system("pause");
}

void ReadString(char * c, int length)
{
    std::cin.getline(c, length);
}

char * GetValueAtIndex(char * const c, int index)
{

    return c + index;

}

A:

Modify your function to return a value not a pointer:
char GetValueAtIndex(char * const c, int index){
    return *(c + index);
}

or simply dereference a pointer returned by a function:
std::cout << *GetValueAtIndex(pointer, 3);

When you have a char* pointer like:
char* p = "Hotdog";

and send that p to std::cout it will be treated as a pointer to (a first character of a) C style string and printed as such. C style strings end with \0. So it will print out whatever the character the p points to followed by all the remaining characters until it reaches the end of the string that is \0.
If you increment a pointer it then points at the next character etc:
char* p = "Hotdog";
p++;
std::cout << p;
p+=3;
std::cout << p;

If you just need to print a single character the p points at then send a dereferenced pointer to std::cout:
char* p = "Hotdog";
std::cout << *p;

A:

Why do I return a series of a chars for a pointer return type?

You return a pointer to a character, exactly as you state what you're trying to do.

I expect to return a pointer at the index[2]

That pointer was returned, as you expected.

Though instead, I get the chars dog.

That is because you insert the pointer into a stream. The stream insertion operator for char* requires that the input is a pointer to a null terminated string and the behaviour is to print that entire string. Your pointer points to an array of chars starting from the character 'd'.

I am thinking about dereferencing it

If you dereference the pointer, you will get the character that is pointed to ('d'):
std::cout << *GetValueAtIndex(pointer, 3) << std::endl;

