1

Alright, this is a really quick question: why does this first block of code compile, but the second one doesn't? They seem like they should be equivalent, since all that I change is the variable declaration/references.

First:

int memberStudents(struct studentType x, Snodeptr students, Snodeptr *s) {
    Snodeptr p = *s;

    while (p->next != NULL) {
        if (strcmp(x.sid, p->student.sid) == 0)
            return 1;

        p = p->next;
    }

    return 0;
}

Second:

int memberStudents(struct studentType x, Snodeptr students, Snodeptr *s) {
    while (s->next != NULL) {
        if (strcmp(x.sid, s->student.sid) == 0)
            return 1;

            s = s->next;
    }

    return 0;
}

I want to change the Snodeptr s so that it points to the proper place, but when I try the second block of code I get an error saying there is a request for member 'next' in something not a struct or union.

4

4 に答える 4

3

Snodeptr *sSnodeptr pは異なるタイプであるため、動作が異なります

試す(*s)->next

于 2012-12-06T19:16:30.477 に答える
2

最初のブロックでは、whileループはSnodeptrインスタンスで動作します。2番目のブロックでは、を操作していSnodeptr*ます。

于 2012-12-06T19:16:20.757 に答える
1

2番目のコードでは、を使用してs->next != NULLいます。sはポインターです。

最初のコードでは、を使用してp->next != NULLいます。pはポインタではありません

于 2012-12-06T19:16:57.433 に答える
1

これ(2番目のスニペットのわずかに変更されたバージョン)がコンパイルされることを期待しています:

int memberStudents(struct studentType x, Snodeptr students, Snodeptr *s) {
    while ((*s)->next != NULL) {
        if (strcmp(x.sid, (*s)->student.sid) == 0)
            return 1;

            (*s) = (*s)->next;
    }
    return 0;
}
于 2012-12-06T19:22:34.850 に答える