2

所以我以为我理解了地址、指针和 & 符号,然后这发生在我身上。如果我以简单的方式创建一个数组,并尝试以各种方式打印出它的地址,就像这样......

string textArray[5] = {"test1", "test2", "test3", "test4", "test5"};

cout << "Address of string &array: " << &textArray << endl;
cout << "Address of string array: " << textArray << endl;
cout << "Address of string &array[0]: " << &textArray[0] << endl;

正如我所料,所有 3 行都打印相同的内存地址。但是,如果您将第一行更改为

string *textArray = new string[5] {"test1", "test2", "test3", "test4", "test5"};

cout << "Address of string &array: " << &textArray << endl;
cout << "Address of string array: " << textArray << endl;
cout << "Address of string &array[0]: " << &textArray[0] << endl;

&textArray 的地址不一样!所以我的问题是为什么?通常在数组中,地址只是指向第一个元素的指针。但这在动态分配的数组中不是真的吗?我从 &textArray 返回的地址是什么?

4

6 回答 6

3

string textArray[5]是一个由 5 个字符串组成的数组,而string *textArray是一个指向字符串的指针。

当您打印数组名称时,它通过提供与第一个和第三个相同的地址衰减为指向第一个元素的指针。

在指针的情况下,当你打印它的值时,它会打印数组的基地址,但是当你打印它的地址时,它会打印指针的地址本身。同一实体不会从一种类型衰变为另一种类型;在这里,指针和数组是不同的实体。

于 2013-11-11T11:43:33.520 回答
0

因为 'char *textArray' 根本不是一个数组。它是一个指针,有自己的地址。

于 2013-11-11T11:38:30.793 回答
0

它应该是:

cout <<"Address of a pointer itself: " << &textArray << endl;
cout <<"Address of array pointed to by this pointer: " << textArray << endl;
cout <<"Address of array pointed to by this pointer: " << &textArray[0] << endl;

&textArray 的地址不一样!所以我的问题是为什么?

因为表达式

string *textArray = new string[5];

创建一个数组和一个指向它的指针。&textArray是这个指针本身的地址。请注意,在第一种情况下

string textArray[5]

您没有将数组分配给某个指针(但textArray它本身就是一个指针)。如果你这样做

string textArray[5];
string *textArrayPtr = &textArray;

那么当您尝试打印时,您将看到与第二种情况相同的结果差异textArrayPtr

cout <<"Address of a pointer iself: " << &textArrayPtr << endl;
cout <<"Address of array pointed to by this pointer: " << textArrayPtr << endl;
cout <<"Address of array pointed to by this pointer: " << &textArrayPtr[0] ;
于 2013-11-11T11:44:57.810 回答
0

实际上这些打印语句

string textArray[5] = {"test1", "test2", "test3", "test4", "test5"};

cout << "Address of string array: " << textArray << endl;

string *textArray = new string[5] {"test1", "test2", "test3", "test4", "test5"};

cout << "Address of string array: " << textArray << endl;

是等价的,因为数组被隐式转换为指向其第一个元素的指针,并且字符串 *textArray 也指向动态分配数组的第一个元素。

另一方面,当您使用定义时

string *textArray = new string[5] {"test1", "test2", "test3", "test4", "test5"};

然后对于变量 textArray 本身,编译器会分配一个内存。它与动态分配的数组占用的内存不相符。这是一个单独的记忆。所以当你写

string *textArray = new string[5] {"test1", "test2", "test3", "test4", "test5"};

cout << "Address of string &array: " << &textArray << endl;

您将获得该内存地址的输出,其中变量 textArray 由编译器放置。

于 2013-11-11T11:47:04.390 回答
0

*textArray是指针,不是数组。

&textArray指的是内存地址textArray;即: 所在的内存位置pointer textArray

textArray指的是存储在 中的数据pointer textArray,实际上就是它所指向的数组的起始地址。

&textArray[0]再次引用 的内存地址textArray[0],该地址是数组的起始地址,与 相同textArray

于 2013-11-11T11:47:08.560 回答
0

我们有两个内存部分,我的变量保存在其中。第一个存储是堆栈,在下面的代码中textArray保存在堆栈存储中,在编译之前它们的大小是明确的变量可以保存在堆栈存储中。

string *textArray = new string[5] {"test1", "test2", "test3", "test4", "test5"};

第二个存储是堆,您可以在程序运行时使用此存储。new您可以使用关键字从该存储中保留内存。在上面的代码中,您为 5 个字符串保留了内存。请注意,当您从堆存储中保留内存时,您必须delete在使用完成时保留它。

因此textArray是保存在堆栈存储中的变量的名称。变量的类型 textArray是指针,因此,当您打印时&textArray,输出是保存在堆栈部分中的变量的地址。当您打印textArray输出是textArray变量的值,它是您的字符串保存在此部分中的堆部分中的地址。 &textArray[0]告诉编译器我的意思是&(*(textArray+0)),这与textArray

于 2015-10-28T22:13:30.757 回答