C ++ Ampersand在新数组前面

时间:2013-11-11 11:33:54

标签: c++ arrays pointers dynamic

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

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;

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

6 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分: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;

  

&amp; 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] ;

答案 3 :(得分: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;

是等价的,因为数组被隐式转换为指向其第一个元素的指针,而string * 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由编译器放置。

答案 4 :(得分:0)

*textArray是指针,而不是数组。

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

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

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

答案 5 :(得分: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

相同