C++中数组元素与原对象内存地址不一致的原因探究
问题解答:数组中对象地址与原对象不一致的原因
核心原因是你创建数组时执行的是对象拷贝操作,而非直接引用原对象。
当你编写Student students[] = {a1, a2, a3};时,C++会为数组单独分配一块新的内存空间,随后将a1、a2、a3的对象内容分别复制到数组的对应元素位置中。也就是说,students[0]是a1的一个副本,二者并非同一个对象,内存地址自然不同。
验证拷贝行为的方法
你可以给Student类添加一个拷贝构造函数,并在其中打印日志,就能直观看到拷贝过程:
Student(const Student& other) { this->age = other.age; this->name = other.name; cout << "拷贝构造函数被调用" << endl; }
运行代码后会发现,数组初始化阶段会三次调用该拷贝构造函数,对应三个原对象的拷贝操作。
让数组元素关联原对象的方法
如果希望数组中的元素与原对象是同一个实例,你需要创建指针数组,而非对象数组:
Student* students[] = {&a1, &a2, &a3};
此时students[0]存储的是a1的内存地址,&(*students[0])的结果会与&a1完全一致。
内容的提问来源于stack exchange,提问作者Ferran Rojas
相关产品推荐
相关产品推荐

