Path: csiph.com!news.mixmin.net!eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Ben Bacarisse Newsgroups: comp.std.c Subject: Re: why can change element of a const typed struct ? Date: Mon, 18 Sep 2023 20:58:52 +0100 Organization: A noiseless patient Spider Lines: 48 Message-ID: <871qevjls3.fsf@bsb.me.uk> References: <6d826a46-8852-4aa3-9e7d-23fac761e840n@googlegroups.com> MIME-Version: 1.0 Content-Type: text/plain Injection-Info: dont-email.me; posting-host="4a1f049c3c0d7d3aa42e2e5e10f8a54b"; logging-data="2032392"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+chBaqD+BAY1H5qe8OudkLuaeFJB69c64=" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) Cancel-Lock: sha1:jf8kb83TaKKBKks/tNm5YY17iDM= sha1:MRr6vyNir0j0x0jNDnQIBg3nFng= X-BSB-Auth: 1.1b1cfb700a7672da24e7.20230918205852BST.871qevjls3.fsf@bsb.me.uk Xref: csiph.com comp.std.c:6573 David Brown 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.