所以我认为我理解地址,指针和&符号,然后发生在我身上。如果我以简单的方式创建一个数组,并尝试以各种方式打印出它的地址,就像这样......
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回来的地址是什么?
答案 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