Почему мы не используем оператор косвенности при попытке доступа к элементу массива с помощью указателя? - PullRequest
0 голосов
/ 06 июля 2019

У меня есть программа, которая запрашивает количество студентов, а затем их имя, фамилию и идентификатор студента.Я пытаюсь напечатать каждое из значений, которые хранятся в массиве студентов.Тем не менее, я получаю сообщение об ошибке 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 ]

1 голос
/ 06 июля 2019

*(students+i)->studentID является эквивалентом *((students+i)->studentID)

Вы пытаетесь разыменовать целое число и получаете ошибку компиляции.

Первая компиляция в порядке, потому что

*(students+i)->firstName совпадает с *((students+i)->firstName), а член firstName является массивом, который распадается на указатель типа char *.Вы можете конечно разыменовать указатели.

1 голос
/ 06 июля 2019

-> является (неявным) оператором косвенного обращения - a->b совпадает с (*a).b.Поэтому, когда вы пишете

*(students+i)->studentID

, это то же самое, что и

*(*(students+i)).studentID

с ДВУМЯ операциями косвенного обращения.

0 голосов
/ 06 июля 2019

Вы можете использовать здесь оператор косвенности, но затем вы используете оператор . вместо ->:

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

Это семантически то же самое, что и

printf("%d\n", (students+i)->studentID);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...