David Brown <
[email protected]> writes:
On 18/09/2023 17:49, Denis Dos Santos Silva wrote:
hi all!
why this works? =)
Your image_t is const, but it has a non-const pointer "data" - there is no restriction to accessing the elements pointed to by source->data.
I feel I must quibble because it can matter to someone learning C.
When accessed via 'const image_t *source', data /is/ (treated as) const.
data is a pointer, and the lvalue expression source->data is const
qualified. To call it a "non-const pointer" is using a common
shorthand, but one I've found is very confusing to beginners.
We casually talk about "const pointers" and "non-const pointers" because
we all know what we mean, but people learning C can get confused by what
is and is not const-qualified. It's a handy shorthand because an actual
'const pointer' is not seen so often:
char *const endp = start + strlen(start);
But we often see this
const char *end = start + strlen(start);
described as a const pointer even though changing the pointer is
perfectly valid:
end -= 1; // permitted because end is pointer that is not const
So your function can't change "source->data",
Right, because data is treated as a const pointer. Calling it a
non-const pointer is potentially confusing. I know what you meant, but
is it clear to everyone?
but it /can/ change "source->data[sindex]".
"const" does not pass through layers of pointers, it only applies to the first pointed-at layer.
Your remark suggests that there is something special about one level of indirection, but there isn't.
--
Ben.
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)