为什么这是一个按指针传递函数?

时间:2018-01-03 06:50:31

标签: c++ parameters

我正在从course on Udacity学习C ++。

你能解释一下为什么setGrades()被定义为指向值的传递函数吗?为什么传递值会出错?在下面的代码中,我省略了printGrades()setID()的定义。

#include<iostream>
using namespace std;

const int SIZE = 5;
template <class T>
class StudentRecord
{
    private:
        const int size = SIZE;
        T grades[SIZE];
        int studentId;
    public:
        StudentRecord(T defaultInput);
        void setGrades(T* input);
        void setId(int idIn);
        void printGrades();
};

template<class T>
StudentRecord<T>::StudentRecord(T defaultInput)
{
    for(int i=0; i<SIZE; ++i)
        grades[i] = defaultInput;
}

template<class T>
void StudentRecord<T>::setGrades(T* input)
{
    for(int i=0; i<SIZE;++i)
    {
        grades[i] = input[i];
    }
}

int main()
{
    StudentRecord<int> srInt(-1);
    srInt.setId(111111);
    int arrayInt[SIZE]={4,3,2,1,4};
    srInt.setGrades(arrayInt);
    srInt.printGrades();
    return 0;
}

输出应该是:

ID# 111111: 4
 3
 2
 1
 4

3 个答案:

答案 0 :(得分:1)

C ++不允许按值传递内置C风格的数组。可以通过引用传递数组将指针传递给数组的第一个元素。给定这样的指针,可以访问整个数组。

指针传递不是文献中常用的术语,但是人们一次又一次地创造出类似的术语,这显示出某种真正的需要。这个术语背后的想法如下:一个按值传递指针,但目标是让函数作为左值访问指向的对象(通常通过引用传递该对象来实现)。

答案 1 :(得分:0)

这仅仅是因为你想要给setGrades一个数组,因为你想要设置数组的所有SIZE值&#39; grade&#39;。

正如您所知,数组的名称可以像指向该数组的第一个值的指针一样使用。 例如,您可以将* arrayInt写为等于arrayInt [0]的术语。

因此,当您将指向数组的第一个元素的指针传递给setGrades时,该函数可以使用arrayName [i]获取该数组的其他元素,其中i介于0和SIZE之间。

答案 2 :(得分:0)

您想将数组传递给setGrades,您也可以这样定义:

void StudentRecord<T>::setGrades(T input[])

然而,编译器会自动将其转换为T*指针。

函数将始终为编译期间提供的所有参数创建自己的副本(请参阅:call by value)。就在这里它是一个数组,但编译器不能立即将数组分配给另一个数组。进行数组赋值的唯一方法是逐个分配它的元素(或复制数组的整个内存块),编译器不会这样做。如果有一个类型为T的指针指向数组的第一个元素,编译器确实知道你可以访问整个数组。它是传递整个数组的另一种方式。

这是将数组传递给函数的最常用方法。