我对C语言还比较陌生,一直在学习有关带指针的链表的信息。
我了解到
(*foo).bar
是同一广告foo->bar
。
使用foo->bar
是因为它更具可读性。
因此,我不明白为什么这些代码段的行为不同:
1)
void appendCourse(CourseNode** pLL, Course c){
CourseNode * root = *pLL;
CourseNode* last = makeCourseNode(c);
if(root != NULL){
CourseNode node = *root;
while(node.pNext != NULL){
node = *node.pNext;
}
node.pNext = last;
} else {
*pLL = last;
}
}
和
2)
void appendCourse(CourseNode** pLL, Course c){
CourseNode * root = *pLL;
CourseNode* last = makeCourseNode(c);
if(root != NULL){
CourseNode *node = root;
while(node->pNext != NULL){
node = node->pNext;
}
node->pNext = last;
} else {
*pLL = last;
}
}
在我看来,看起来像1)应该表现为先引用后再引用成员访问。有点像(*foo).bar
但是1)似乎根本无法正常工作,它只能成功添加第一个元素。
2)确实将所有元素添加到了链表中。
以防万一:我的结构和其他方法:
typedef struct CourseNode {
struct CourseNode* pNext;
Course course;
} CourseNode;
typedef struct
{
StudentNode *pWaitlistHead; // Waitlist for this course
char szCourseId[12]; // Course Identifier
char szRoom[15]; // Room number of the course
char szDays[15]; // What days the course will meet, ex: MWF, TR, etc
char szTimes[15]; // Meeting Time, ex: 10:00-11:15am
int iAvailSeats; // Number of available seats in the course
double dFee; // Additional fees for the course
} Course;
CourseNode* makeCourseNode(Course c){
CourseNode * node = malloc(sizeof(CourseNode));
node->pNext = NULL;
node->course = c;
return node;
}
答案 0 :(得分:2)
CourseNode node = *root;
while(node.pNext != NULL){
node = *node.pNext;
}
这将创建一个名为CourseNode
的新node
。该新CourseNode
的值被修改,但是对链接列表没有影响。
CourseNode *node = root;
while(node->pNext != NULL){
node = node->pNext;
}
在这里,node
指向链接列表上的CourseNode
。
了解差异的最简单方法是,第一个代码摘录创建新的CourseNode
。就像这两者之间的区别:
int foo (int *i)
{
int *j = i; // j is a pointer to the same int i points to
*j = 2; // this changes the value of the int i points to
int j = *i; // this creates a new int
j = 2; // this changes the value of that new int
}