类数组是如何工作的(c++)?它在声明时得到内存吗
how class array work(c++)? Does it get a memory while declaration?
程序引用:(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分配一个新地址,但您将为两个地址分配相同的值。因此,它们具有相同的值但不同的地址
- 在内存不足之前,我可以声明多少个 const 变量?
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 为什么一个接一个声明的两个变量在内存中不相邻?
- 内存浪费?如果main()应该只返回0或1,那么为什么main是用int而不是短int甚至char声明的
- 如果我提前将参数声明为变量而不是将它们内联写入函数调用,那有什么区别(在内存方面)?
- C++ 11 通过在类声明中使用指针来节省内存
- 我们应该全局声明一个向量还是在递归函数中传递它以减少内存使用
- 声明变量以保存字符串列表时的内存分配
- 当您声明指向char数组的指针时,存储在内存中
- 在类中声明 CUDA __constant__内存
- 在声明节点创建链接列表时,为什么静态内存分配不起作用
- 如何为共享内存转发声明自定义unique_ptr
- 只有当声明一个对象时,内存空间才会分配给类的数据成员,那么为什么 Sizeof(class_name) 给我结果
- 是否必须在内存中"next to each other"两个相邻声明的公共字段?
- 如果在循环中声明了指针变量,则它是否与循环的每次传递都与相同的内存地址相关联
- 声明指针时的隐式内存分配和初始化
- 如果我声明一个没有名称的类实例,它会保留在内存中吗?
- 声明向量时出现神秘的 malloc 内存分配错误
- 为什么编译器不将内存分配给类内声明的变量
- 声明变量大小数组,而无需使用动态内存分配