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

C 在尝试使用指针访问数组元素时,为什么不使用间接运算符?,c,C,我有一个计划,要求一些学生,然后他们的名字,姓氏和学生ID。我试图打印存储在学生数组中的每个值。但是,我在printf(“%d\n”,*(students+I)->studentID)行上得到一个错误需要指针操作数('int'无效) 我尝试将行更改为printf(“%d\n”,(students+I)->studentID)而且似乎有效。为什么会发生这种情况,为什么我们不需要对上面打印字符的打印语句执行此操作?谢谢 #include <stdio.h> #include <st

我有一个计划,要求一些学生,然后他们的名字,姓氏和学生ID。我试图打印存储在学生数组中的每个值。但是,我在
printf(“%d\n”,*(students+I)->studentID)行上得到一个错误需要指针操作数('int'无效)

我尝试将行更改为
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);
}
#包括
#包括
#包括
类型定义结构学生{
charfirstname[20];
char lastName[20];
国际学生;
}学生;
作废打印记录(学生*学生,整数大小){
对于(int i=0;i名字);//prints
printf(“%c\n”,*(学生+i)->姓氏);//打印
printf(“%d\n”,*(students+i)->studentID);//不打印
}
}
int main(int argc,const char*argv[]{
记录的整数;
printf(“请输入要添加的记录数:\n”);
scanf(“%d”和记录的数量);
学生证;
S=(学生*)malloc(学生人数)*记录数量);
for(int i=0;i<记录数;i++){
printf(“学生的名字%d\n”,i+1);
scanf(“%s/n”,s[i].firstName);
printf(“学生的姓氏%d\n”,i+1);
scanf(“%s/n”,s[i].lastName);
printf(“学生%d\n的学生ID”,i+1);
scanf(“%d/n”,&S[i].studentID);
}
打印记录(记录的数量);
}

可以在此处使用间接运算符,但是您可以使用成员运算符
而不是
->

printf("%d\n", (*(students+i)).studentID);
这在语义上与

printf("%d\n", (students+i)->studentID);
*(*(students+i)).studentID
*(students+i)->studentID
相当于
*((students+i)->studentID)

尝试取消对整数的引用时,会出现编译错误

第一个编译为ok,因为

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

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

*(students+i)->studentID
那跟

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

有两个间接操作。

这是
(*s)之间的区别。firstName
s->firstName
printf(“%c\n”,*(students+i)->firstName)
您没有显示定义的
students
数组的位置(您在函数
printRecords()
中使用它)。@wildplasser抱歉,我已经添加了它。访问数组
a
I
第th个元素的正确方法是
a[I]
。请永远不要使用
*(a+i)
。写
学生[i]。姓名等。谢谢。