Как использовать typedef struct - PullRequest
0 голосов
/ 19 мая 2018

Я совершенно новичок в C, и у меня проблемы с указателями и typedef struct структурами.

У меня есть два typedef struct s: Student и Class, и яинтересно, являются ли они указателями или нет:

typedef struct _Class {
    char name;
    int grade;
} Class;

typedef struct _Student {
    int number;
    Class *classes;
} Student;

int main() {
    Student **students = (Student**) malloc(100 * sizeof(Student*));
    Student * studentOne;
    (*studentOne).number = 453;
}

Это только часть моей программы, но мой вопрос: почему мы определили массив students как двойные указатели, а Student *studentOne как указатель, нов typedef из _Student мы имеем массив Class *classes в виде одного массива указателей.

Итак, в моей структуре программы Student - это указатель, а структура Class - нет.Почему?

Определение обоих typedef struct одинаково, поэтому, когда использовать структуру в качестве указателя?

Спасибо за ваши ответы.

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

По вашим вопросам мне кажется, что вы не совсем понимаете указатели и распределение памяти, поэтому я попытаюсь объяснить это просто

Student * studentOne;

Может вести себя как двавещи:

  1. Простой указатель на ученика.Используйте эту опцию, если вы хотите выделить ученика в кучу
  2. Массив учеников.Для этого варианта вы должны сделать что-то вроде этого:

    Student * studentArr = (Student *) malloc (NUM_OF_STUDENTS * sizeof (Student))

Если вы этого не сделаетеесли вы хотите, чтобы ученик сидел внутри кучи, вам просто нужно создать простую переменную ученика

Student stud;

, если вы хотите, чтобы в стеке был массив учеников, он должен быть создан следующим образом:

Student stud[NUM_OF_STUDENTS]

На коллегу

Student ** studentMat;

Может вести себя как две вещи:

  1. Массив указателей на студентов
  2. Матрица ученика

Для первого варианта вы сделаете это:

Student ** studentPtrArr = (Student**)malloc(NUM_OF_STUDENTS * sizeof(Student*))
for(int i=0; i < NUM_OF_STUDENTS; i++){
    Student[i] = (Student *)malloc(sizeof(Student))
}

Для второго варианта вы сделаете это:

Student ** studentPtrArr = (Student**)malloc(NUM_OF_STUDENT_ROWS * sizeof(Student*))
for(int i=0; i < NUM_OF_STUDENTS; i++){
    Student[i] = (Student *)malloc(NUM_OF_STUDENT_COLUMNS sizeof(Student))
}
0 голосов
/ 19 мая 2018

Нет, псевдоним типа Class (и другие) являются , а не типами указателей.Это просто псевдонимы, например, struct _Class.

Так что вместо (например)

Student * studentOne;

вы можете написать

struct _Student * studentOne;

Если , у вас также есть псевдоним типа для структуры _Student!

...