Pointer Decay in C++
“Arrays are really just pointers”.
This is one of the biggest “gotchas” out there. It’s one that, at the end of the day, really isn’t even that big of a deal. You could live happily for the rest of your life convinced that arrays and pointers are the exact same thing (though I wouldn’t recommend it). But arrays aren’t pointers. They decay into pointers. Plus you can’t change where they point to, but that really isn’t the point here..
Before I go on, I want to pick this very obvious spot to point out that everything I’m about to explain was pulled almost entirely from this thread on gamedev, including most of the program below (with other, clearer versions in the thread). Reading through that post will probably benefit you much more than reading through this one, especially the parts on the extra indirection after a function call towards the end, which won’t be mentioned here.
Anyway, take the following code:
#include <iostream>
#include <string>
static const size_t ARRAY_SIZE=5;
void display_array_info(int size, const std::string &title)
{
std::cout << title << std::endl;
std::cout << "Array size: " << size << std::endl;
}
template <typename T, size_t U>
void reference(const T (&some_array)[U])
{
display_array_info(sizeof(some_array), "By Reference:");
}
template <typename T, size_t U>
void value(const T some_array[])
{
display_array_info(sizeof(some_array), "By \"Value\":");
}
template <typename U>
void pointer(const U* const some_array)
{
display_array_info(sizeof(some_array), "By Pointer:");
}
int main(int argc, char *argv[]) {
int integer_array[ARRAY_SIZE] = { 2, 4, 6, 8, 10 };
std::cout << "From Main:" << std::endl;
std::cout << "Array size: " << sizeof(integer_array) << std::endl;
pointer<int>(integer_array);
value<int, ARRAY_SIZE>(integer_array);
reference<int, ARRAY_SIZE>(integer_array);
std::cin.get();
return 0;
}
Which, for me, will output:
From Main:
Array size: 20
By Pointer:
Array size: 4
By "Value":
Array size: 4
By Reference:
Array size: 20
(the array takes up 20 bytes in total…)
So what exactly is going on here?
Continue Reading »