节目报价:( 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循环分配值(可能以其他方式)。 实际上,我无法真正区分指针和类。
答案 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分配新地址,但是您要为两个地址分配相同的值。因此,它们具有相同的值但地址不同