如何使用typedef结构

时间:2018-05-19 12:52:49

标签: c pointers struct typedef

我对C完全陌生,而且我在使用指针和typedef struct结构时遇到了麻烦。

我定义了两个typedef structStudentClass,我想知道这些是否是指针:

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的{​​{1}} 1}}我们将数组_Student作为单个指针数组。

所以在我的程序结构中Class *classes是一个指针,结构Student不是。为什么呢?

两个Class的定义是相同的,所以什么时候使用结构作为指针?

感谢您的回答。

2 个答案:

答案 0 :(得分:2)

不,类型别名Class(和其他)是不是指针类型。它们只是例如别名struct _Class

所以而不是(例如)

Student * studentOne;
你可以写

struct _Student * studentOne;

如果 您还有_Student结构的类型别名!

答案 1 :(得分:1)

根据您的问题,在我看来,您并不真正理解指针和内存分配,所以我会尝试解释它

学生* studentOne;

可以表现为两件事:

  1. 指向学生的简单指针。如果要在堆上分配学生,请使用此选项
  2. 一群学生。对于此选项,您可以执行以下操作:

    学生* studentArr =(学生*)malloc(NUM_OF_STUDENTS * sizeof(学生))

  3. 如果你不想让学生坐在堆里,你只需要创建一个简单的学生变量

    Student stud;
    

    如果您想在堆栈上创建一个学生数组,则应该像这样创建

    Student stud[NUM_OF_STUDENTS]
    

    对应

    Student ** studentMat;
    

    可以表现为两件事:

    1. 一系列指向学生的指针
    2. 学生矩阵
    3. 对于选项一,您可以这样做:

      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))
      }