我对C完全陌生,而且我在使用指针和typedef struct
结构时遇到了麻烦。
我定义了两个typedef struct
: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
的{{1}} 1}}我们将数组_Student
作为单个指针数组。
所以在我的程序结构中Class *classes
是一个指针,结构Student
不是。为什么呢?
两个Class
的定义是相同的,所以什么时候使用结构作为指针?
感谢您的回答。
答案 0 :(得分:2)
不,类型别名Class
(和其他)是不是指针类型。它们只是例如别名struct _Class
。
所以而不是(例如)
Student * studentOne;
你可以写
struct _Student * studentOne;
如果 您还有_Student
结构的类型别名!
答案 1 :(得分:1)
根据您的问题,在我看来,您并不真正理解指针和内存分配,所以我会尝试解释它
学生* studentOne;
可以表现为两件事:
一群学生。对于此选项,您可以执行以下操作:
学生* studentArr =(学生*)malloc(NUM_OF_STUDENTS * sizeof(学生))
如果你不想让学生坐在堆里,你只需要创建一个简单的学生变量
Student stud;
如果您想在堆栈上创建一个学生数组,则应该像这样创建
Student stud[NUM_OF_STUDENTS]
对应
Student ** studentMat;
可以表现为两件事:
对于选项一,您可以这样做:
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))
}