Hi.
I often see the following function declaration:
some_func(const unsigned char * const buffer)
{
}
Any idea why the const is repeated before the pointer name?
Thanks.
Hi.
I often see the following function declaration:
some_func(const unsigned char * const buffer)
{
}
Any idea why the const is repeated before the pointer name?
Thanks.
This makes it a const pointer to a const value, rather than a mutable pointer to a const value or a const pointer to a mutable value.
It's a constant pointer to a constant unsigned char. You can't change the pointer nor the thing it points to.
const * unsigned char const buffer
means that you cannot modify the pointer buffer
nor the memory that buffer
points to.
In a declaration like const * const T
, the first const
(before the *
) means that what the pointer points at is const
(i.e. it's a pointer to a const T
). The const
after the *
means that the pointer itself is const
(i.e. can't be modified to point at anything else).
A couple of articles to help you understand const correctness in C++:
The first const says that the data pointed to is constant and may not be changed, the second says that the pointer itself may not be changed:
char my_char = 'z';
const char* a = &my_char;
char* const b = &my_char;
const char* const c = &my_char;
a = &other_char; //fine
*a = 'c'; //error
b = &other_char; //error
*b = 'c'; //fine
c = &other_char; //error
*c = 'c'; //error
assuming const unsigned char * const
Everyone is correct that its a const pointer to a const unsigned char.
C++ types read mostly right to left unless there are any modifiers on the far left then these read left to right.
type declarations should(?) be read RTL. const
modifies the thing on its left, but the rule is complicated by the fact that you can write both const T
and T const
(they mean the same thing).
T * const
is a constant pointer to mutable TT & const
would be constant reference to mutable T, except references are constant by definitionT const *
is a mutable pointer to constant TT const &
is a reference to constant TT const * const
is constant pointer to constant T