类数组如何工作(c ++)?声明时会记忆吗?

时间:2015-12-25 04:05:04

标签: c++

节目报价:( stephen prata,c ++ primer plus第六版,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 个答案:

答案 0 :(得分:0)

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 *在指针之前的运算符意味着获取存储在该地址中的值。让我们有点棘手并尝试使用a[1]获取b。由于整数是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  

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

答案 1 :(得分:-3)

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