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