Итак, недавно я наткнулся на следующий фрагмент кода:
struct Student
{
int *number;
char *name;
double *marks;
};
int main(){
int n;
Student *s;
s = new Student;
cout << "Enter the number of subjects the student learns: ";
cin >> n;
s->number= new int;
s->name=new char[20];
s->marks=new double[n];
cout << "Enter the name of the student: ";
cin >> s->name;
cout << "Enter the number in class of " << s->name << ": ";
cin >> *(s->number);
for (int i = 0 ; i < n ; i++){
cout << "Enter mark No" << i+1 << " of the student: ";
cin >> s->marks[i];
}
}
Когда я работал с одномерными массивами указателей, возникала необходимость дважды использовать разыменование. Один раз, чтобы добраться до n-го указателя массива (в данном случае "s->marks[i]") и второй раз, чтобы получить фактическое значение, на которое указывает, что, как я думал, означало написать его так:
*(s->marks[i])
Это, по-видимому, не нужно, хотя я думал, что это вернет серийный номер памяти, содержащийся в указателе «marks [i]». С другой стороны, необходимо разыменовать указатель «число», который представляет собой единственную переменную:
*(s->number)
Это я прекрасно понимаю.
Может кто-нибудь объяснить мне (или указать на хорошую статью), почему нет необходимости использовать оператор разыменования при работе с динамически размещаемыми массивами указателей, такими как, в данном случае, «метки». Меня также смущает использование указателя массива символов "name", который используется скорее как обычная переменная char.
Заранее спасибо за помощь.
Редактировать, чтобы подвести итог:
Я только сейчас понял, что
/*the following two statements declare an array of pointers hence allow for the
use of double dereference*/
int* marks[n]; //static memory allocation
int** marks=new int*[n]; //dynamic memory allocation
/*the following two statements declare an array of variables hence allow for the
use of only one dereference (just a simple 1 dimensional array)*/
int marks[n]; //static memory allocation
int* marks=new int[n]; //dynamic memory allocation
Я думал, что имею дело с чем-то похожим на первую пару утверждений. На самом деле мне пришлось иметь дело со второй парой.
Student
не выделялся динамически без необходимости. Это плохой код, не воспринимайте его как пример того, как все делается. - person jrok   schedule 02.05.2014