Finding the instance reference of an object [long and probably boring]

Grant Edwards grante at visi.com
Sat Nov 8 20:12:55 EST 2008


On 2008-11-08, Terry Reedy <tjreedy at udel.edu> wrote:
> Steven D'Aprano wrote:
>> In an attempt to keep this post from hitting the ridiculous length of one 
>
>> (Aside: I've learned one thing in this discussion. Despite the number of 
>> sources I've read that claim that if you pass an array to a C function 
>> the entire array will be copied, this does not appear to be true....)
>
> Since C does not have an array type, it is impossible to pass an array.
> int *a, b[10] declares *both* a and b as int pointers.  As I remember, 
> the only difference is that b is initialized to the address of an 
> allocated block of 10.

No, that's not true.  "b" is not a pointer that's initialized
with an address. "b" is a constant literal that is equivalent
to the address of the first element in the "array".  IOW,
(void*)b == (void*)&b == (void*)&b[0].

That's not true for a.  (void*)a == (void*)&a[0], 
but (void*)a != (void*)&a.

> In expressions, b is an int pointer, just like a, and a[i] and
> b[i] are defined the same, as *(a+i) and *(b+i), where the
> addition is pointer arithmetic.

True, but &a and &b are very different, and "a" can be used as
an lvalue and "b" can not.  "a" is a variable, and "b" is a
literal constant (that can, for static storage classes, be
resolved to a value at compile/load time).

> Function definitions can only define parameters as pointers
> (and lots else), not arrays.  So passing either a or b passes
> the address it represents.  (Function names also represent 
> addresses in expressions, whereas, I believe, in C99 at least,
> struct names represent the struc, not its address.)

-- 
Grant




More information about the Python-list mailing list