Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c > #163862
| From | David Brown <david.brown@hesbynett.no> |
|---|---|
| Newsgroups | comp.lang.c |
| Subject | Re: on understanding & and pointer arithmetic |
| Date | 2021-12-16 16:23 +0100 |
| Organization | A noiseless patient Spider |
| Message-ID | <spfllt$vkn$1@dont-email.me> (permalink) |
| References | <86a6h0eiy9.fsf@levado.to> |
On 16/12/2021 15:13, Meredith Montgomery wrote:
> I'm investigating the syntax array[index] and I'm getting surprised at
> some places. My intuition says that a[3] is the same as a + 3. I also
> know that /&a/ is the same as /a/. I first expected the following
> program to print ``lo, world\n'' three times, but it does not.
I can see why you are confused - you are close, but a bit mixed up.
"a[3]" is the same as "*(a + 3)". The dereferencing is crucial.
In the code below, "a" is an array of 13 char - and that is its type.
When you take its address, "&a", you have a pointer to an array of 13
char. This will have the same /value/ as &a[0], which is a pointer to
the first element of the array - a pointer to a char.
In many expressions (apart from "sizeof a" or "&a"), "a" will decay to a
pointer to its first element. That is, the "array of char" is turned
into a "pointer to char". And this pointer will have the same /value/
as &a[0], and therefore as &a. But it is not the same thing, even when
used in an expression - types are very important.
>
> --8<---------------cut here---------------start------------->8---
> #include <stdio.h>
> int main() {
> char a[] = "hello, world";
> printf("a: %s\n", &a[3]);
&a[3] is the address of element 3 (i.e., the fourth letter) of the array
"a".
> printf("a: %s\n", a + 3);
"a" here gets converted to a pointer to the first element, and then 3
elements are added - giving a pointer to a char at the address of element 3.
> printf("a: %s\n", &a + 3);
"a" here is the full array, so "&a" is a pointer to an array of 13 char.
Adding 3 gives a new pointer to an array of 13 char, at the address 39
bytes higher than address of "a". Basically, you are pretending that
there is an array of 4 elements, each of which is itself an array of 13
chars - with "a" being the first of those 4 elements. Now you are
asking to print the 4th element here, which is just whatever happens to
be in the memory at that address.
> }
> --8<---------------cut here---------------end--------------->8---
>
> %./hello.exe
> a: lo, world
> a: lo, world
> a: ▒
> %
>
> I think part of my problem is a type-confusion I'm making. The type of
> a + 3 must still be (char *) while the third one must be some other
> type?
Yes. Understanding the source of your confusion is the first step
towards resolving it.
>
> I get the my-expected result this way:
>
> --8<---------------cut here---------------start------------->8---
> #include <stdio.h>
> int main() {
> char a[] = "hello, world";
> printf("a: %s\n", &a[3]);
> printf("a: %s\n", a + 3);
> printf("a: %s\n", (char*) &a + 3);
> }
> --8<---------------cut here---------------end--------------->8---
>
> So I think I must correct my intuition to remember that &var does not
> produce a type ``char *''. What does it produce? Which reference could
> I check to see an official statement of the fact?
For a good reference, I like "en.cppreference.com". Here are some
relevant pages:
<https://en.cppreference.com/w/c/language/conversion>
<https://en.cppreference.com/w/c/language/operator_member_access>
<https://en.cppreference.com/w/c/language/array>
That site is an easier reference than reading the standards. But it is
still a reference - you may want a tutorial page rather than a reference.
>
> My real request is --- can you educate me on this matter? I don't think
> I'm looking at things in the proper way. For example,
>
> printf("a: %s\n", (char*) (&a + 3));
>
> produces the garbage I saw before.
>
> Trying to see what's going on, I wrote
>
> printf("a: %p\n", a);
> printf("a: %p\n", a + 3);
> printf("a: %p\n", &a + 3);
>
> and I got
>
> --8<---------------cut here---------------start------------->8---
> %./hello.exe
> a: 0xffffcc33
> a: 0xffffcc36
> a: 0xffffcc5a
> --8<---------------cut here---------------end--------------->8---
>
> which illustrates my misunderstanding. I expected the two last lines to
> print ``a: 0xffffcc36'', but somehow ``&a + 3'' yields ``0xffffcc5a''
> and not the 3 bytes further from 0xffffcc33 that I expected.
>
> Thank you so much.
>
I think you should be able to figure this out now, given what I wrote
earlier.
Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
on understanding & and pointer arithmetic Meredith Montgomery <mmontgomery@levado.to> - 2021-12-16 11:13 -0300
Re: on understanding & and pointer arithmetic Bart <bc@freeuk.com> - 2021-12-16 14:23 +0000
Re: on understanding & and pointer arithmetic Meredith Montgomery <mmontgomery@levado.to> - 2021-12-16 11:57 -0300
Re: on understanding & and pointer arithmetic Ben Bacarisse <ben.usenet@bsb.me.uk> - 2021-12-16 17:42 +0000
Re: on understanding & and pointer arithmetic Bart <bc@freeuk.com> - 2021-12-16 18:14 +0000
Re: on understanding & and pointer arithmetic Ben Bacarisse <ben.usenet@bsb.me.uk> - 2021-12-16 21:14 +0000
Re: on understanding & and pointer arithmetic Meredith Montgomery <mmontgomery@levado.to> - 2021-12-16 16:42 -0300
Re: on understanding & and pointer arithmetic Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2021-12-16 12:44 -0800
Re: on understanding & and pointer arithmetic Meredith Montgomery <mmontgomery@levado.to> - 2021-12-18 12:06 -0300
Re: on understanding & and pointer arithmetic Ben Bacarisse <ben.usenet@bsb.me.uk> - 2021-12-16 21:34 +0000
Re: on understanding & and pointer arithmetic Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2021-12-16 14:14 -0800
Re: on understanding & and pointer arithmetic Ben Bacarisse <ben.usenet@bsb.me.uk> - 2021-12-16 23:44 +0000
Re: on understanding & and pointer arithmetic Meredith Montgomery <mmontgomery@levado.to> - 2021-12-18 12:09 -0300
Re: on understanding & and pointer arithmetic David Brown <david.brown@hesbynett.no> - 2021-12-16 16:23 +0100
Re: on understanding & and pointer arithmetic Meredith Montgomery <mmontgomery@levado.to> - 2021-12-16 16:25 -0300
Re: on understanding & and pointer arithmetic David Brown <david.brown@hesbynett.no> - 2021-12-16 21:08 +0100
Re: on understanding & and pointer arithmetic Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2021-12-16 12:54 -0800
Re: on understanding & and pointer arithmetic David Brown <david.brown@hesbynett.no> - 2021-12-17 10:53 +0100
Re: on understanding & and pointer arithmetic Meredith Montgomery <mmontgomery@levado.to> - 2021-12-18 11:39 -0300
Re: on understanding & and pointer arithmetic scott@slp53.sl.home (Scott Lurndal) - 2021-12-18 16:31 +0000
Re: on understanding & and pointer arithmetic David Brown <david.brown@hesbynett.no> - 2021-12-18 18:56 +0100
Re: on understanding & and pointer arithmetic Meredith Montgomery <mmontgomery@levado.to> - 2021-12-25 21:29 -0300
Re: on understanding & and pointer arithmetic Bart <bc@freeuk.com> - 2021-12-18 18:29 +0000
Re: on understanding & and pointer arithmetic Meredith Montgomery <mmontgomery@levado.to> - 2021-12-18 11:32 -0300
Re: on understanding & and pointer arithmetic Manfred <noname@add.invalid> - 2021-12-16 21:34 +0100
Re: on understanding & and pointer arithmetic Ben Bacarisse <ben.usenet@bsb.me.uk> - 2021-12-16 22:20 +0000
Re: on understanding & and pointer arithmetic Meredith Montgomery <mmontgomery@levado.to> - 2021-12-18 12:02 -0300
Re: on understanding & and pointer arithmetic Meredith Montgomery <mmontgomery@levado.to> - 2021-12-18 12:34 -0300
Re: on understanding & and pointer arithmetic Manfred <noname@add.invalid> - 2021-12-18 18:36 +0100
Re: on understanding & and pointer arithmetic Ben Bacarisse <ben.usenet@bsb.me.uk> - 2021-12-18 21:17 +0000
Re: on understanding & and pointer arithmetic James Kuyper <jameskuyper@alumni.caltech.edu> - 2021-12-16 18:59 -0500
Re: on understanding & and pointer arithmetic James Kuyper <jameskuyper@alumni.caltech.edu> - 2021-12-16 18:38 -0500
Re: on understanding & and pointer arithmetic Bart <bc@freeuk.com> - 2021-12-16 23:50 +0000
Re: on understanding & and pointer arithmetic "james...@alumni.caltech.edu" <jameskuyper@alumni.caltech.edu> - 2021-12-17 07:34 -0800
Re: on understanding & and pointer arithmetic Bart <bc@freeuk.com> - 2021-12-17 17:48 +0000
Re: on understanding & and pointer arithmetic Ben Bacarisse <ben.usenet@bsb.me.uk> - 2021-12-16 23:56 +0000
Re: on understanding & and pointer arithmetic James Kuyper <jameskuyper@alumni.caltech.edu> - 2021-12-16 19:06 -0500
Re: on understanding & and pointer arithmetic Ben Bacarisse <ben.usenet@bsb.me.uk> - 2021-12-17 00:10 +0000
Re: on understanding & and pointer arithmetic Meredith Montgomery <mmontgomery@levado.to> - 2021-12-18 12:32 -0300
Re: on understanding & and pointer arithmetic Meredith Montgomery <mmontgomery@levado.to> - 2021-12-18 12:30 -0300
Re: on understanding & and pointer arithmetic David Brown <david.brown@hesbynett.no> - 2021-12-17 11:08 +0100
Re: on understanding & and pointer arithmetic Manfred <noname@add.invalid> - 2021-12-17 16:24 +0100
Re: on understanding & and pointer arithmetic David Brown <david.brown@hesbynett.no> - 2021-12-17 18:17 +0100
Re: on understanding & and pointer arithmetic Meredith Montgomery <mmontgomery@levado.to> - 2021-12-18 12:11 -0300
csiph-web