On Wed, Jan 28, 2009 at 6:00 AM, Jeremy Pereira <a...@jeremyp.net> wrote:
>
> On 27 Jan 2009, at 23:07, Graham Cox wrote:
>
>>
>> On 28 Jan 2009, at 2:24 am, Jeremy Pereira wrote:
>>
>>> Yes.  That is correct, but since buffer is already a pointer to the first
>>> byte of the array and then you are taking a reference to it, key will end up
>>> containing the address of the buffer.  You really need:
>>>
>>>> uint key = *(uint*)buffer;
>>>
>>
>>
>> That's incorrect. Or rather, in this case it doesn't make any difference,
>> but the use of '&' is more general as it works whether buffer is an array or
>> not.
>>
>>
>> When you declare:
>>
>> uint8 buffer[8];
>>
>> You've reserved 8 bytes on the stack. Whether you use 'buffer' or
>> '&buffer' you obtain the same address, as C treats array variables as
>> pointers. But:
>
> Having tried it just now, I stand corrected.
>
> However, I would argue that this is the C compiler behaving in a
> deliberately inconsistent way, since in C, arrays and pointers are supposed
> to be the same thing.  As buffer is actually a constant, taking its address
> should really result in a compiler error in the same way as int a = &123;

It's not the C compiler, it's the language. This behavior is required
by the language specification, so the compiler can't help but comply.

The pointer/array duality is one of the most confusing things in C
because it is somewhat inconsistent, but it's also quite
straightforward.

Let's say you declare an array:

int x[32];

Now if you use the symbol "x", it has type int*. As such, it's
perfectly valid to write something like x+2 (gives you a pointer to
the 3rd element of the x array), to pass x directly to functions which
take pointers, and to cast it to another pointer type. It's even legal
to write *x, which gets you the first element of the array.

What happens when you use "&x"? That gives you the same value *but of
a different type*. The type of &x is int*[32], i.e. a pointer to an
array of 32 ints. You can declare a pointer of this type using amusing
and bizarre syntax:

int (*y)[32] = &x;

This has consequences for pointer arithmetic. (&x)+2 is not the same
as (x+2); the latter gives you the 3rd element of the array, the
former gives you a pointer off into hyperspace, where the 3rd array
would be if you stacked 3 (or more) of these things up contiguously.

Now we can talk all we want about how these things "should" work, and
I agree that this behavior can be kind of odd, but the fact is that
it's a part of the language, a part of the standard, it is how it is,
and it's not going to be changed.

Mike
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to