为什么在尝试使用指针访问数组元素时不使用间接运算符?

时间:2019-07-06 15:51:36

标签: c

我有一个程序,该程序要求一些学生,然后要求他们的名字,姓氏和学生ID。我正在尝试打印存储在学生数组中的每个值。但是,在printf("%d\n", *(students+i)->studentID);的第Indirection requires pointer operand ('int' invalid)行出现错误。

我尝试将行更改为printf("%d\n", (students+i)->studentID);,但似乎可行。为什么会发生这种情况,为什么我们不需要为上面打印字符的打印语句执行此操作?谢谢

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Students {
    char firstName[20];
    char lastName[20];
    int studentID;
} Student;

void printRecords(Student *students, int size){

    for(int i = 0; i < size; i++){
        printf("%c\n", *(students+i)->firstName);  // prints
        printf("%c\n", *(students+i)->lastName);   // prints
        printf("%d\n", *(students+i)->studentID);  // does not print

     }
}

int main(int argc, const char * argv[]) {

    int number_of_records;

    printf("Please enter the number of records you would like to add:\n");
    scanf("%d", &number_of_records);

    Student *S;
    S = (Student*)malloc(sizeof(Student) * number_of_records);

    for(int i = 0; i < number_of_records; i++){
        printf("First name of student %d\n", i+1);
        scanf("%s/n", S[i].firstName);

        printf("Last name of student %d\n", i+1);
        scanf("%s/n", S[i].lastName);

        printf("StudentID of student %d\n", i+1);
        scanf("%d/n", &S[i].studentID);
    }

    printRecords(S, number_of_records);
}

3 个答案:

答案 0 :(得分:1)

*(students+i)->studentID等效于*((students+i)->studentID)

您尝试取消对整数的引用,并得到编译错误。

第一个编译正常,因为

*(students+i)->firstName*((students+i)->firstName)相同,成员firstName是一个数组,其衰变到char *类型的指针。您当然可以取消引用指针。

答案 1 :(得分:1)

->是一个(隐式)间接操作符-a->b(*a).b相同。所以当你写

*(students+i)->studentID

相同
*(*(students+i)).studentID

具有两次间接操作。

答案 2 :(得分:-1)

可以在此处使用间接运算符,但随后使用成员运算符.代替->

printf("%d\n", (*(students+i)).studentID);

这在语义上与

相同
printf("%d\n", (students+i)->studentID);