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

问题描述 投票:1回答:3

我正在从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
c++ parameters
3个回答
1
投票

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

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


0
投票

这只是因为它是一个你想要给setGrades的数组,因为你想设置数组'grade'的所有SIZE值。

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

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


0
投票

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

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

但是编译器会自动将其转换为T*指针。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.