具有动态数组和结构 C++ 的函数中的引用

References in functions with dynamic arrays and structures C++

我无法理解我在 C++ 中的两个函数所发生的事情之间的理论。不幸的是,我无法复制整个代码,因为我必须将所有代码从我的母语翻译成英语。我在这里遇到的困境如下: - allStudents 和 oldAnswers 都是动态数组 - 函数 dataEntry 按原样工作得很好,它更改了 allStudents,并且更改在主函数中有效,尽管参数是 dataEntry (Student * allStudents...) 而不是 dataEntry (Student *& allStudents.. .) - 为了让函数 addNewAnswer 有效地改变主函数中的指针 oldAnswers,我必须用 & 定义参数,所以 addNewAnswer (AllAnswers *& oldAnswers...)

为什么一个没有 & 而另一个不工作,尽管两者都有效地更改了指针?是不是因为函数addNewAnswer也改变了数组的大小(内存分配)?

 int questionsCounter = 5;
    enum Answers { CORRECT, INCORRECT };

    struct Student {
        int _stNumber;
        char _name[30];
        int _year;
        Answers *_answers;
        char * _userName;
        char *_password;
    };

    struct AllAnswers {
        int AnswerNumber;
        char *Question;
        Answers correctAnswer;
    };

    void dataEntry(Student * allStudents, int max) {

    for (int i = 0; i<max; i++) {
        cout << "\t::STUDENT " << i + 1 << "::";
        cout << "Enter Student's name: ";
        cin.getline(allStudents[i]._name, 30);
        cout << "Enter Student's number: ";
        cin >> allStudents[i]._stNumber;
        cout << "Enter Student's year (1,2,3,4): ";
        cin >> allStudents[i]._year;


        allStudents[i]._userName = new char[11];
        allStudents[i]._userName = GetUserName(allStudents[i]);

        allStudents[i]._password = nullptr;
        changePassword(allStudents[i]);     
    }
}

void addNewAnswer (AllAnswers *& oldAnswers, AllAnswers newAnswer) {

    AllAnswers *temp = new AllAnswers[questionsCounter+1];


    for (int i = 0; i < questionsCounter; i++)
    {   
        copyAnswer(oldAnswers[i], temp[i]);
    }

    copyAnswer(newAnswer, temp[questionsCounter]);

    deallocateAnswers(oldAnswers);

    assert(oldAnswers != NULL);

    oldAnswers = new AllAnswers[questionsCounter+1];


    for (int i = 0; i < questionsCounter+1; i++)
    {
        copyAnswer(temp[i], oldAnswers[i]); 

    }

    questionsCounter++; 
}

oldAnswers = 编辑指针本身,就像你说的那样。

operator[] 实际上是一个接受指针和 returns 引用的函数。当你有 allStudents[i] = 时,你实际上并没有编辑指针本身。相反,您正在 i Students 经过 allStudents 指针并编辑那里的任何内容。

因此 allStudents 是另一个指针的副本(按引用传递)还是别名(按值传递)并不重要,因为在任何一种情况下,所有 students[i] returns 相同引用相同 Student.

当不做课程作业时,使用 std::vector 而不是 new[]。在 value/reference 语义方面,它比指向堆的指针更直观,后者会派上用场。