【问题标题】:C++ How to pass array by reference to functionC ++如何通过引用函数来传递数组
【发布时间】:2016-04-11 01:07:01
【问题描述】:

这是我在学习 C++ 时一直在研究的工作代码。
我如何修改它以便 ArraySortToMedian() 使用指针表示法而不是数组表示法来处理数组?

到目前为止,我的所有尝试都没有奏效,因此我缺少逻辑关系或语法中的某些内容。提前谢谢你。

#include <iostream>
#include <fstream>

double ArraySortToMedian(int [], int ); 

using namespace std;

int main() 
{
    ifstream infile;
    infile.open("numbers.txt");

    const int SIZE = 6;
    int array[SIZE];
    int i = 0;
    double median;

    if(!infile)
    {
    cout << "couldn't find 'numbers.txt'";
    return 1;   
    }

    while(i < SIZE && infile >> array[i])
    i++;

    infile.close();

    for(i = 0; i < SIZE; i++)
    cout << *(array + i) << "!\n"; 

    median=ArraySortToMedian(array, SIZE);

    cout<< "\n" << median << "\n";
    return 0;
}

double ArraySortToMedian(int (x[]), int numElem)
{
    bool swap;
    int temp, i;
    double m;

    do
    {
    swap = false;
    for(i = 0;i < (numElem - 1); i++)
    {
        if( x[i] > x[i + 1] )
        {
            temp = x[i];
            x[i] = x[i + 1];
            x[i + 1] = temp;
            swap = true;
        }
    }
    }
    while (swap);
    cout << "\n";
    for(i = 0; i < numElem; i++)
    cout << x[i] << "\n";

    m = (x[numElem/2] + x[numElem/2]-1)/(double)2;
    return(m);
}

【问题讨论】:

  • 它们总是通过引用传递。很难(即不可能)做的事情是通过 value 传递它们。
  • 你有充分的理由不使用 std::vector 吗?
  • 在我开始学习向量和指针语法之间的关系之前,尝试理解数组和指针的关系。
  • 这个问题有答案here

标签: c++ arrays function pass-by-reference


【解决方案1】:

可以这样做。但是,我强烈建议您不要这样做,您最好使用std::array 来获得更清晰的实现。这种函数参数的语法非常难看。

使用原始 C 数组

template <size_t N>
double ArraySortToMedian(int (&x)[N], int numElement); 

使用 STL 数组

template <size_t N>
double ArraySortToMedian(std::array<int,N>& x, int numElement)

这不适用于动态分配的数组,如果您尝试重载这些模板以处理指向以new 分配的数组的指针,它会变得更加复杂。

【讨论】:

    【解决方案2】:

    只需将签名更改为int* arr 并使用*(x + i) 访问受尊重的元素

    【讨论】:

    • 这是使用参考符号返回中位数的语法,到目前为止对我有用:return ((x + (numElem)/2)+*(x + (numElem-1) )/2))/(双)2;我做错了什么是这样写的: double FunctionName(int arr[]) [ ] 对于参考是多余的,因为 arr 已经指向它的元素首地址。有了经验,我将学习更好的实践,并减少语法错误。感谢您帮助我到达那里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2020-11-29
    • 2020-07-30
    • 2012-04-17
    • 2019-06-29
    相关资源
    最近更新 更多