Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #163946

Re: on understanding & and pointer arithmetic

From Meredith Montgomery <mmontgomery@levado.to>
Newsgroups comp.lang.c
Subject Re: on understanding & and pointer arithmetic
Date 2021-12-18 11:32 -0300
Organization Aioe.org NNTP Server
Message-ID <86v8zm7zmd.fsf@levado.to> (permalink)
References <86a6h0eiy9.fsf@levado.to> <spfllt$vkn$1@dont-email.me> <8635msbbcu.fsf@levado.to> <spg6b8$on0$1@dont-email.me>

Show all headers | View raw


David Brown <david.brown@hesbynett.no> writes:

> On 16/12/2021 20:25, Meredith Montgomery wrote:
>> David Brown <david.brown@hesbynett.no> writes:
>> 
>>> 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.
>> 
>> Thank you!
>> 
>>> 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.
>> 
>> Yes, so that corrects me at least once.  I didn't think &a would be of a
>> different type.  So the type of &a is array of 13 char.  I get that.
>
> /No/.  "a" is of type "array of 13 char".  "&a" is of type "pointer to
> array of 13 char".  These are different.

Yes --- thanks.  That's what I meant, but didn't write.

>> The value of &a is the same /value/ as &a[0].  I also get that.  I'm
>> good here.
>
> Correct.  As Ben said (and Ben is very good at explaining things
> accurately), a pointer has a type and has an address as it's value.  So
> the values of pointers here are the same, but the pointers themselves
> are different because they have different types.

Yes, I think I will never make that mistake again because that corrected
my intuition now.  I was thinking of a pointer as just a variable
holding an integer, but there is a type associated to it which totally
changes arithmetic with it.  That's my new intuition.  Thanks for
helping me get there --- and for checking my work in your previous post.

[...]

> Once you feel you have got the hang of this, repeat the whole thing with
> an array of "int" rather than an array of "char".  That will help you
> appreciate where the scalings come in.  (Note that while an "int" is 4
> bytes, or 4 chars, on your platform, it is not necessarily the case on
> other C implementations, especially for very small devices.)

I got the hang of it.  Let's see.  I'll write the program with my
predictions in comments --- and run it.

--8<---------------cut here---------------start------------->8---
#include <stdio.h>
int main(void) {
  int a[] = {1, 2, 3};
  printf("%lu\n", (unsigned long) a); // some address
  printf("%lu\n", (unsigned long) &a); // same address

  printf("%lu bytes\n", (unsigned long) sizeof a);  // 12 bytes
  printf("%lu bytes\n", (unsigned long) sizeof &a); // 8 bytes

  // this will jump 12 bytes to the right
  printf("%lu\n", (unsigned long) (&a + 1));
  printf("Jumped %lu bytes to the right\n", 
         (unsigned long) (&a + 1) - (unsigned long) &a);

  // this will hump 36 bytes to the right
  printf("%lu\n", (unsigned long) (&a + 3));
  printf("Jumped %lu bytes to the right\n", 
         (unsigned long) (&a + 3) - (unsigned long) &a);
}
--8<---------------cut here---------------end--------------->8---

%make arrint
cc -Wall -x c -g -std=c99 -pedantic-errors    arrint.c   -o arrint

%./arrint.exe
4294954036
4294954036
12 bytes
8 bytes
4294954048
Jumped 12 bytes to the right
4294954072
Jumped 36 bytes to the right
%

That looks good!  Thanks very much!

Back to comp.lang.c | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


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