类数组是如何工作的(c++)?它在声明时得到内存吗

how class array work(c++)? Does it get a memory while declaration?

本文关键字:声明 内存 数组 何工作 工作 c++      更新时间:2023-10-16

程序引用:(stephen-prata,c++引物加第六版,4.24)

#include <iostream>
#include <vector>
#include <array>
int main(int argc, const char * argv[]) {
// insert code here...
using namespace std;
double a1[4] = {1.2, 2.4, 3.6, 4.8};
vector<double> a2(4);
a2[0] = 1.0/3.0;
a2[1] = 1.0/5.0;
a2[2] = 1.0/7.0;
a2[3] = 1.0/9.0;
array<double, 4> a3 = {3.14, 2.72, 1.62, 1.41};
array<double, 4> a4;
a4 = a3;
cout << "a1[2]: " << a1[2] << " at " << &a1[2] << endl;
cout << "a2[2]: " << a2[2] << " at " << &a2[2] << endl;
cout << "a3[2]: " << a3[2] << " at " << &a3[2] << endl;
cout << "a4[2]: " << a4[2] << " at " << &a4[2] << endl;
a1[-2] = 20.2;
cout << "a1[-2]: " << a1[-2] << " at " << &a1[-2] << endl;
cout << "a3[2]: " << a3[2] << " at " << &a3[2] << endl;
cout << "a4[2]: " << a4[2] << " at " << &a4[2] << endl;
return 0;
}

结果是

a1[2]: 3.6 at 0x7fff5fbff7f0
a2[2]: 0.142857 at 0x100105520
a3[2]: 1.62 at 0x7fff5fbff648
a4[2]: 1.62 at 0x7fff5fbff628
a1[-2]: 20.2 at 0x7fff5fbff7d0
a3[2]: 1.62 at 0x7fff5fbff648
a4[2]: 1.62 at 0x7fff5fbff628
Program ended with exit code: 0

环境:mac os,xcode 7.1.1

我对类数组感到困惑:为什么a4的地址与a3不同,因此a4等于a3(我也认为a4指向a3)。

假设:1.c++重载运算符"=",当类数组出现时,它会将内存分配给数组,并通过for循环赋值(可能通过其他方式)。2.实际上,我并不能真正区分指针和类。

array<>实际上是一个结构,它的全部目的是支持一些在普通的内建一体([])中没有提供的功能。例如,这些功能之一就是分配。

int a[4];   
int b[5];  
a=b //Error    
array<int,4> a;  
array<int,4> b;
a=b // valid   

另一个功能是访问大小,当您将内置type[]的数组传递给函数时,您必须同时传递大小,但对于array<>类型,您可以通过调用.size()来获取大小
现在指针是一种数据类型,它保存一个值,该值是内存中的一个地址。所以当你说int a[4],然后尝试打印cout<<a;,你会得到和地址值。但是如果你打印a[0],那么编译器会理解为(获取指针a的值,转到那个地址并将值存储在那里)话虽如此,为了使我写的第一个赋值有效,你可以这样做,

int a[4];   
int* b; //now b is a pointer that points to an integer   
b= a; // valid   

现在要打印a中的第一个元素,只需调用a[0]即可访问它,但要使用指针b,则需要使用*b,指针前的*运算符表示获取存储在该地址中的值。让我们变得有点棘手,并尝试使用b获取a[1]。由于整数是4个字节,那么下一个元素将比第一个元素提前4倍(内存地址面向字节),因此a[1]等于*(b+4),依此类推。
如果你使用新的关键字,那么你会得到你期望的行为,我认为

int* a = new int[3]{1,2,3};   
int* b;   
b= a;   
cout << &a[2] << "  " << &b[2]; //output will be same value  

原因是,当你使用新的关键字时,内存是在堆中分配的,除非你自己做,否则它不会被释放,即使你离开了变量定义的范围,所以分配值只是将它们相互链接,而不是复制整个值本身(优化性能是有意义的,否则你会比想象的更快耗尽内存)。我希望你能从这个答案中得到一些东西:)。阅读文档了解更多信息。

当您分配一个数组对象时,您将分别为变量a3和a4分配一个新地址,但您将为两个地址分配相同的值。因此,它们具有相同的值但不同的地址

相关文章: