2016-09-26 4 views
0

Я начинаю C++ и имею понимание проблемы со следующим кодом.Понимание проблем с двойными указателями и их передача в функции

#include <iostream> 
using namespace std; 

struct student { 

    string name; 

    int age; 

    float marks; 

}; 

struct student *initiateStudent(string , int , float); 
struct student *highestScorer(student **, int); 

int main () { 

int totalStudents = 1; 

string name; 

int age; 

float marks; 

cin >> totalStudents; 

student *stud[totalStudents]; 

for(int i = 0; i < totalStudents; i++) { 

cin >> name >> age >> marks; 

stud[i] = initiateStudent(name,age,marks); 

} 


student *topper = highestScorer(stud,totalStudents); 


cout << topper->name << " is the topper with " << topper->marks << " marks" << endl; 

for (int i = 0; i < totalStudents; ++i) 
{ 
    delete stud[i]; 
} 

return 0; 

} 

struct student *initiateStudent(string name, int age, float marks) 
{ 
    student *temp_student; 
    temp_student = new student; 
    temp_student->name = name; 
    temp_student->age = age; 
    temp_student->marks = marks; 
    return temp_student; 
} 


struct student *highestScorer(student **stud, int totalStudents) 
{ 
    student *temp_student; 
    temp_student = new student; 
    temp_student = stud[0]; 
    for (int i = 1; i < totalStudents; ++i) 
    { 
     if (stud[i]->marks > temp_student->marks) 
     { 
     temp_student = stud[i]; 
     } 
    } 

    return temp_student; 
} 

код работает отлично, но я не понимаю, почему я должен объявить STRUCT студент функции * highestScorer (студент **, целый); с ** то есть двойной указатель, когда передающий указатель только инициализируется одним.

Я бы объявил функцию только одним *, так как это тип переменной, которую я бы передавал?

спасибо.

+4

Я думаю, вам нужно остановиться и прочитать хорошую вводную книгу на C++. Для всех этих указателей и утечек памяти нет необходимости. – juanchopanza

+0

'stud' не является' student * ', это массив' student * '. (Это похоже на C-код с вершиной распределения C++ и ввода-вывода. [Здесь] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) является хорошим выбор книг на C++.) – molbdnilo

+1

Я думаю, что использование 'std :: vector ' решит многие ваши проблемы. –

ответ

0

Поскольку переменная stud в main представляет собой массив указателей student. Когда вы передаете массив по аргументу, вам нужен указатель на первый элемент, независимо от его элементов. Поскольку массив представляет собой массив указателей, у вас есть указатель на указатель.

+1

С этим кодом намного больше ошибок. –

+0

Может быть. Но это другой вопрос. – vz0