【问题标题】:References in functions with dynamic arrays and structures C++具有动态数组和结构 C++ 的函数中的引用
【发布时间】:2018-05-19 12:38:45
【问题描述】:

我无法理解我在 C++ 中的两个函数所发生的情况之间的理论。不幸的是,我无法复制整个代码,因为我必须将所有代码从我的母语翻译成英语。我在这里的困境如下: - allStudents 和 oldAnswers 都是动态数组 - 函数 dataEntry 的工作方式非常好,它更改了 allStudents,并且更改在主函数中有效,尽管参数是 dataEntry (Student * allStudents...) 而不是 dataEntry (Student *& allStudents.. .) - 为了让函数addNewAnswer有效地改变main函数中的指针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++; 
}

【问题讨论】:

  • AllAnswers *&amp; oldAnswers - 对指针的引用,当您更改指针指向稍后的位置时需要 oldAnswers = new AllAnswers[questionsCounter+1]; 如果您只传递指针的副本,则无法执行此操作
  • Reference to a pointer的可能重复

标签: c++ pointers structure


【解决方案1】:

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

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

因此,allStudents 是另一个指针的副本(通过引用传递)还是别名(通过值传递)并不重要,因为在任何一种情况下,所有 students[i] 都会返回对相同 @987654329 的相同引用@。

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

【讨论】:

  • 为什么投反对票?如果有不准确的地方,你应该指出来。
  • 是的,现在很有意义,谢谢!所以在第一种情况下,我们正在改变东西,但我们改变的不是指针,这就是效果发生的原因。在第二种情况下,我们正在更改指针以及其他内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 2021-11-15
  • 1970-01-01
  • 2019-07-19
  • 2012-10-11
  • 1970-01-01
相关资源
最近更新 更多