c++ question
Grant Robinson
santiago at mr-r.net
Sat Sep 23 19:44:04 MDT 2006
On Sep 23, 2006, at 1:49 PM, Dave Smith wrote:
> Grant Robinson wrote:
>> It depends on what you mean by "character array". If you are
>> talking about a variable declared like so:
>>
>> char myarray[32];
>>
>> Then to get the address, you would do the following:
>>
>> print("The address is %p\n", (&myarray));
>>
>> If you are talking about a variable declared like:
>>
>> char *myarray = new char[32];
>>
>> Then the address is stored in 'myarray', and de-referencing
>> 'myarray' will give you the actual contents of the string.
>>
>
> Wrong. In both cases (char* and char[]), the variable itself stores
> the address. You do not need the & operator in either case.
True, you do not NEED the operator. However, as illustrated below,
using the & operator yields consistent results. Fundamentally, a
'pointer' holds an address to someplace else, and therefore it's
address (the pointers location in memory) is not necessarily the same
as the address of the data it points to. Non-pointer variables
location in memory is the same as the address of the actual data. I
will have to brush up on my CS 330 terminology if anyone wants to
drill any deeper than that.
>
> In fact, using the & operator is incorrect, because it will give
> you the address of the variable that was already holding the
> address of the character array, instead of the address of the
> character array.
False (at least with g++ 4.0.1). The following code snippet
illustrates this:
#include <stdio.h>
int main(int argc, char **argv) {
char array1[32];
char *array2 = new char[32];
printf("location of array1: %p\n", array1);
printf("location of array2: %p\n", array2);
printf("address of &array1[0]: %p\n", &(array1[0]));
printf("address of &array2[0]: %p\n", &(array2[0]));
printf("address of &array1: %p\n", &array1);
printf("address of &array2: %p\n", &array2);
delete[] array2;
return 0;
}
Output on my machine:
location of array1: 0xbffff6fc
location of array2: 0x5002d0
address of &array1[0]: 0xbffff6fc
address of &array2[0]: 0x5002d0
address of &array1: 0xbffff6fc
address of &array2: 0xbffff6f8
What this says to me:
array1 == (&(array1[0])) == (&array1)
array2 == (&(array2[2]))
but
array2 != (&array2)
(parentheses are for clarity and/or to make Scheme and Lisp lovers
more comfortable)
:)
Grant
More information about the PLUG
mailing list