首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用引用和指针将数组作为参数传递

使用引用和指针将数组作为参数传递
EN

Stack Overflow用户
提问于 2018-10-15 17:16:29
回答 2查看 53关注 0票数 0

我试图学习如何使用视频课程的指针和引用,我发现指针和引用非常复杂。

我试着做一个非常基本的练习,这样我就能知道它是如何工作的。看起来是这样的:

代码语言:javascript
复制
void print(int &array, int size)
{
    for (int i = 0; i < size; i++)
    {
        cout << array[i] << " ";
    }
}

int main()
{
    int n, a[10];
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    print(a, 5);
    return 0;
}

它不起作用,因为我将数组作为引用传递。如果我将函数原型更改为

代码语言:javascript
复制
void print(int *array, int size)

它工作得很完美。

有人能解释一下为什么吗?我认为在这种情况下,使用指针或引用应该是相同的。两者都会导致数组。我说错了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-15 17:19:10

类型int &arrayarray声明为对单个int变量的引用,而不是对int元素数组的引用。

它适用于指针的原因是数组自然衰变到指向它们的第一个元素的指针。也就是说,当您传递a时,您真正传递的是&a[0],它是int*类型的。

票数 2
EN

Stack Overflow用户

发布于 2018-10-15 17:39:54

通过值传递意味着将给定的参数复制到具有参数名称的变量。然后,可以在函数中访问该变量。所以当你做这样的事情:

代码语言:javascript
复制
void MyFunction(int* myptr);

真正传递的是指针的副本。也就是说,它将作为参数(它所持有的地址)的指针的值复制到myptr。复制指针然后访问该地址的值,该值与原始指针所指向的值相同。所以当你这么做的时候

代码语言:javascript
复制
void print(int* array, int size);

真正传递的是地址到第一个元素的副本。当您声明这样的数组时:

代码语言:javascript
复制
int array[20];

该数组实际上是一个指针,因此如果您将它称为:

代码语言:javascript
复制
 *array

那就等于:

代码语言:javascript
复制
array[0]

通过引用传递意味着传递的值与原始值在内存中的位置相同。

代码语言:javascript
复制
int print(int& array, int size)

该函数只接受一个int值(而不是数组),该函数可以自由地修改该值,因为这些更改将影响调用方函数中的原始变量。

我希望这能澄清两者之间的区别。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52821726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档