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


Groups > comp.lang.c > #163967

Re: on understanding & and pointer arithmetic

From Manfred <noname@add.invalid>
Newsgroups comp.lang.c
Subject Re: on understanding & and pointer arithmetic
Date 2021-12-18 18:36 +0100
Organization Aioe.org NNTP Server
Message-ID <spl66f$1t5v$1@gioia.aioe.org> (permalink)
References <86a6h0eiy9.fsf@levado.to> <spfllt$vkn$1@dont-email.me> <spg7sd$10ue$1@gioia.aioe.org> <87fsqsur88.fsf@bsb.me.uk> <86o85e6jo0.fsf@levado.to>

Show all headers | View raw


On 12/18/2021 4:02 PM, Meredith Montgomery wrote:
> Ben Bacarisse <ben.usenet@bsb.me.uk> writes:
> 
>> Manfred <noname@add.invalid> writes:
>>
>>> On 12/16/2021 4:23 PM, David Brown wrote:
>>>> On 16/12/2021 15:13, Meredith Montgomery wrote:
>>> [...]
>>>>
>>>>>     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.
>>>>
>>>
>>> It might be worth mentioning that accessing memory at that address (&a
>>> + 3) technically yields undefined behavior, because it is an attempt
>>> to access a location outside the array (a).
>>>
>>
>> That's a good point to make.
> 
> Indeed.  Thanks.  (I was aware of that.  In fact, I thought that my OP
> would produce a lot of --- that's undefined behavior and, so, C has
> nothing to do with it.  Lol.  But, thankfully, you guys went straight
> into helping me clear up my troubles.)
> 
>> It reminds me of a construct that I rather like:
>>
>>    char buffer[some-complex-size];
>>    char *end_of_buffer = (&buffer)[1];
>>
>> (&buffer)[1] means *(&buffer + 1).  The constructed pointer &buffer + 1
>> is valid, and the * does not attempt to dereference it as *(&buffer + 1)
>> is an array-valued expression.  It is, instead, converted to a pointer
>> to the first element of this non-existent array object -- a pointer one
>> past the end of 'buffer'.
> 
> Wow, that's a cool application.  Thanks for sharing.
> 
> I needed to redefine my definition of ``end''.  I tend to think the end
> of an array is its last byte, but agreed --- that's not quite its end
> yet.  It seems hard to define the exact end of something.
> 
> The end of my property should be on my property or should it be outside
> of it?  If *it* is outside, then because because *it* is relative to
> *my* property, this *it* must be mine, so it belongs to my property.  So
> it's not outside of it. :-)
> 
> I would have done
> 
>    char *end_of_buffer = (&buffer)[1] - 1;
> 

It's more about habits in the context of C and how this "end" is used.

C uses the convention that indexes start at 0, which implies that a 
collection of N elements has length N and is indexed from 0 to N-1.
Following the same reasoning, the following is customary in C:

#define N 42
int arr[N];
int* start = arr;
int* first = arr;
int* last = arr+N-1;
int* end = arr+N;

"end" defined this way is never dereferenced, but is typically used 
(a.o.) as:

for (int* p = start; p != end; ++p)
{
   *p = whatever;
}

Writing the same loop using "last" is also possible, but requires using 
"<=" with pointers, which involves additional ordering requirements.

The standard follows the same habit, but is more accurate: it usually 
refers to the boundary of a collection as "one past the end" of it.
However, it is this "one past the end" that is more often used rather 
than the "last element" of the collection.
In fact, the "one past the end" pointer gets special attention from the 
standard for the very purpose of making code like the above legal.

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