当前位置: 首页 > 知识库问答 >
问题:

经典数组与标准数组

司空俊雄
2023-03-14

我尝试了这个简单的程序:

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是否在调用中按值传递?

共有3个答案

农明辉
2023-03-14

std::array在调用中是否通过值传递?

是的。 这样做(传递并返回对象)的能力本质上是std::array存在的原因。

因此,函数参数是函数的本地参数,您返回一个指向这个本地对象的指针,一旦函数返回,这个指针就变成了无效指针。

华凯捷
2023-03-14

缺省情况下,C++中的所有内容都按值传递。 即使是传统的数组示例也会按值传递指针。 当然你可以用指针来改变它所指向的东西。

您的代码实际上具有未定义的行为,因为您返回的指针指向已被销毁的对象的内部,即GetElementarrayy参数,该参数在退出函数时被销毁。

如果要按引用传递,则必须请求引用

int* getElement(std::array<int, 4>& arrayy, int index) {
    return &arrayy[index];
}

参数类型名称后面的&起到了很大的作用。

卫嘉言
2023-03-14

在通过复制传递指针的情况下,指向的at值在函数和调用站点中是相同的。 所以第一个程序做了您期望的事情。

在第二个程序中,它是不同的,因为std::array具有值语义,因此通过副本传递它意味着您也传递了所有底层内存的副本。 如果想要获得与第一个程序相同的效果,则需要通过引用传递std::array:

int* getElement(std::array<int, 4> &arrayy, int index) {
                                // ^  reference
    return &arrayy[index];
}

注意,在您的第二个程序中的代码中,0的结果是不保证的。 您正在返回一个指针,该指针指向复制的std::array中的一个值,当函数返回时,该值将终止。 这将调用未定义的行为。

 类似资料:
  • 我在将对象 stdClass 转换为数组时遇到问题。我尝试过这种方式: 或 或 投射前的数组满了一条记录,在我尝试投射后它是空的。如何在不删除其行的情况下转换/转换它? 转换前的数组: 如果我尝试生成<code>var_dump($booking),则after cast为空NULL 我也尝试过这个函数,但总是空的:

  • 本文向大家介绍浅谈Javascript 数组与字典,包括了浅谈Javascript 数组与字典的使用技巧和注意事项,需要的朋友参考一下 Javascript 的数组Array,既是一个数组,也是一个字典(Dictionary). 先举例看看数组的用法。 上面的代码创立了一个数组,每个元素都是一个字符串对象。 然后对数组进行遍历。注意 i 的结果为 0 和 1,a[i] 的结果才为字符串。 这个很象

  • 本文向大家介绍Objective-C 经典字典数组排序 - 省市区,包括了Objective-C 经典字典数组排序 - 省市区的使用技巧和注意事项,需要的朋友参考一下 1.首先要准备好包含所有省市区的文档,将文档拖到我们建好的Xcode里 2.然后新建一个路径NSString *path = @" ";   再将省市区文档拖到@"  "中; 3.在进行排序前,我们首先要先滤清思路:这答题的难题是在

  • 本文向大家介绍Javascript数组与字典用法分析,包括了Javascript数组与字典用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了Javascript数组与字典用法。分享给大家供大家参考。具体分析如下: Javascript 的数组Array,既是一个数组,也是一个字典(Dictionary). 先举例看看数组的用法。 上面的代码创立了一个数组,每个元素都是一个字符串对象。

  • 问题内容: 我有一个排序的数组,想要对它进行二进制搜索。 所以我想问一下Swift库中是否已有诸如sort等的东西?还是有类型独立版本可用? 当然,我可以自己编写它,但是我想避免再次发明轮子。 问题答案: 这是使用二进制搜索的通用方法:

  • vector 是可变大小的数组。和 slice(切片)类似,它们的大小在编译期不可预知,但他们可以随时扩大或缩小。一个 vector 使用 3 个词来表示:一个指向数据的指针,它的长度,还有它的容量。此容量表明了分配多少内存给这 vector。vector 只要小于该容量,就可以随意增长。当临界值就要达到时,vector 会重新分配一个更大的容量。 fn main() { // 迭代器可以

  • 问题内容: 我有一个numpy数组,其中特定行的每个单元格代表一个功能的值。我将它们全部存储在100 * 4矩阵中。 知道如何将每个值都介于0和1之间的numpy.array的行标准化吗? 我想要的输出是: 提前致谢 :) 问题答案: 如果我理解正确,那么您要做的就是除以每一列中的最大值。您可以使用广播轻松地做到这一点。 从示例数组开始: 在第0维(即行)上取最大值。这为您提供了一个大小向量,其中

  • 问题内容: 我试图了解何时使用React功能组件和类,并从文档中阅读它们并没有真正详细介绍。当您希望类的特定功能构成组件时,能否给我下面的一些主要例子? 功能组件的功能较弱,但更简单,并且仅使用一个render()方法就类似于类组件。除非您需要仅在类中可用的功能,否则我们建议您改用功能组件。 问题答案: 您仅在以下情况下需要组件: 需要组件 状态 或 需要 生命周期方法 。例如等