char color= "white";
color is an array of 6 characters. One for each character in "white" and one for the null terminator at the end to signify the end of the string. This line is the same as saying
char color = "white";
So when you do this:
char* pColor = &color;
You are getting a pointer to color. Since color is only 6 entries big, there is no 10 entry. Therefore, pColor is a bad pointer.
You are doing the same thing here:
pList = &list[NUMBER_LIST];
'list' only has 3 elements (ie: index  is the maximum index). So if you get a pointer to index , then that is a pointer to outside the array. IE: it's a bad pointer.
If you want a pointer to the start of the array, then use index 0:
char* pColor = &color; // now pColor points to the first element in the color array.
int* pList = &list; // and pList points to the first element in the list array.
Although, this can be shortcutted because array names can be implicity cast. So you can just do this:
char* pColor = color; // same as = &color
int* pList = list; // same as = &list
Also, 1 pointer = 1 memory address. When you try to print the addresses on line 30.. you can't loop through pList and pColor as if they were arrays, because they're not arrays. They're a single pointer.
What you're actually doing there is looping through the array they point to.
int* pList = list; // pList points to the list array
for(int i = 0; i < 3; ++i)
cout << pList[i]; // <- this will not print an address, but will print the contents
// of the list array.. just as if you were printing list[i]
cout << pList; // <- this will print an address
char pointers also need to be cast because they are interpretted as strings by iostream. So you'll have to cast them to some other kind of pointer to actually have the address printed.
cout << pColor; // will print "white"
cout << (void*)(pColor); // will print the address of the color array