c++ - 经典数组与 std::array
问题描述
我试试这个简单的程序:
int* getElement(int arrayy[], int index) {
return &arrayy[index];
}
int main() {
int arrayy[4]{};
*getElement(arrayy, 2)=50;
std::cout << arrayy[2] << '\n';// here it prints 50 !
return 0;
}
getElement()
将通过指针返回返回我的数组元素的地址,在 main 中取消引用它,然后更改值。
我想std::array
代替经典数组做同样的事情。
int* getElement(std::array<int, 4> arrayy, int index) {
return &arrayy[index];
}
int main() {
std::array<int, 4> arrayy{};
*getElement(arrayy, 2)=50;
std::cout << arrayy[2] << '\n';//here it prints 0 !
return 0;
}
第一个打印 50 ,第二个打印 0 !
std::array
在调用中传递值吗?
解决方案
在通过 value传递指针的情况下,指向的值在函数和调用站点中是相同的。所以第一个程序做你所期望的。
在第二个程序中,它是不同的,因为它std::array
具有值语义,因此按值传递它意味着您也在传递所有底层内存的副本。
请注意,在第二个程序的代码中,0
不能保证结果。您正在返回一个指向复制内部值的指针,该值std::array
将在函数返回时消失。这会调用未定义的行为。
如果要获得与第一个程序相同的效果,则需要std::array
通过引用传递:
int* getElement(std::array<int, 4> &arrayy, int index) {
// ^ reference
return &arrayy[index];
}
推荐阅读
- python - Apache Beam Python gscio 上传方法已实现@retry.no_retries 导致数据丢失?
- python-3.x - 在 sqlalchemy 过滤器中使用 and_ 不起作用
- sql - 几何类型的替代 First() 函数
- r - 使用 DoParallel R 将 FOR 循环更改为 FOR EACH 循环
- python - 在 Python 中的列中裁剪字符串
- javascript - javascript if..else 语句应该可以工作,但不能
- c# - 复制所选文本
- javascript - 移相器场景恢复间隔
- c# - ServiceCollection IOptions<> 无法正确绑定
- tinymce - TinyMCE 没有使用正确的删除线格式