具有动态数组和结构 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 语义方面,它比指向堆的指针更直观,后者会派上用场。
我无法理解我在 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 语义方面,它比指向堆的指针更直观,后者会派上用场。