“使用指针访问结构数组”的替代方法

问题描述 投票:-1回答:2

此代码接受struct Student数组,然后使用指针显示它。代码使用不常见的方法。常用方法在此代码本身的单行注释中显示。

但是,这种方法似乎存在一些问题,因为没有显示“百分比”的正确值。谁能告诉我这个问题的原因是什么?

#include<stdio.h>

struct Student
{
    char grade;
    int rollNumber;
    float percentage;
};

typedef struct Student Student;

void acceptArray(Student*);
void displayArray(Student*);

int main()
{
    Student myFriends[3];
    Student* p = myFriends;

    acceptArray(p);
    displayArray(p);
}

void acceptArray(Student* p)
{
    int i = 0;
    for(i = 0; i < 3; i++)
    {
        printf("\nEnter grade, roll number, and percentage:\n");
        scanf(" %c %d %f",
                (p + i),
                //&(p + i)->grade
                //&p[i].grade
                ( (Student*)((unsigned int)p + sizeof(char)) + i ),
                //&(p + i)->rollNumber
                //&p[i].rollNumber
                ( (Student*)((unsigned int)p + sizeof(char) + sizeof(int)) + i )
                //&(p + i)->percentage
                //&p[i].percentage
                );
     }
}

void displayArray(Student* p)
{
    int i = 0;
    for(i = 0; i < 3; i++)
    {
        printf("\nGrade is      :   %c.", *(p + i));
                //(p + i)->grade
                //p[i].grade
        printf("\nRoll number is:   %d.", *( (Student*)((unsigned int)p + sizeof(char)) + i ));
                //(p + i)->rollNumber
                //p[i].rollNumber
        printf("\nPercentage is : %.1f.", *( (Student*)((unsigned int)p + sizeof(char) + sizeof(int)) + i ));
                //(p + i)->percentage
                //p[i].percentage
     }
}
c arrays pointers struct
2个回答
0
投票

您正在尝试将struct对象的单个组件地址传递给scanf。你这样做的方式是错误的。这是不对的,因为(摘自C A参考手册)。

如果需要,可以在任何两个连续组件之间或在结构布局中的最后一个组件之后出现孔或填充,以允许在存储器中正确对齐组件。出现在这种孔中的位图案是不可预测的,并且可能在结构与结构之间或在单个结构内随时间不同。

据说,它总是比我们通常做的更清晰,更易读,更容易阅读(&p[i].grade ..)。简单易懂。


0
投票

您没有正确使用指针。最好的方法是通过[i]对其进行索引,并通过.运算符访问struct成员。

这样你就可以获得更清晰的代码。由于填充孔,建议不要按照您的方式进入结构内部。

#include<stdio.h>

struct Student
{
    char grade;
    int rollNumber;
    float percentage;
};

typedef struct Student Student;

void acceptArray(Student*);
void displayArray(Student*);

int main()
{
    Student myFriends[3];
    Student* p = myFriends;

    acceptArray(p);
    displayArray(p);
}

void acceptArray(Student* p)
{
    int i = 0;
    char c;
    int d;
    float f;

    for(i = 0; i < 3; i++)
    {
        printf("\nEnter grade, roll number, and percentage:\n");
        scanf(" %c %d %f", &c, &d, &f);

                p[i].grade = c;
                p[i].rollNumber = d;
                p[i].percentage = f;
     }
}

void displayArray(Student* p)
{
    int i = 0;
    for(i = 0; i < 3; i++)
    {

        printf("\nGrade is      :   %c.", p[i].grade );
        printf("\nRoll number is:   %d.", p[i].rollNumber ); 
        printf("\nPercentage is : %.1f.", p[i].percentage );
      }
}

OUTPUT:

Enter grade, roll number, and percentage:                                                                                                                                                                                                         
A 1 66.8                                                                                                                                                                                                                                          

Enter grade, roll number, and percentage:                                                                                                                                                                                                         
B 2 77.8                                                                                                                                                                                                                                          

Enter grade, roll number, and percentage:                                                                                                                                                                                                         
C 3 88.9                                                                                                                                                                                                                                          

Grade is      :   A.                                                                                                                                                                                                                              
Roll number is:   1.                                                                                                                                                                                                                              
Percentage is : 66.8.                                                                                                                                                                                                                             
Grade is      :   B.                                                                                                                                                                                                                              
Roll number is:   2.                                                                                                                                                                                                                              
Percentage is : 77.8.                                                                                                                                                                                                                             
Grade is      :   C.                                                                                                                                                                                                                              
Roll number is:   3.                                                                                                                                                                                                                              
Percentage is : 88.9.                                                                                                                                                                                                                             
© www.soinside.com 2019 - 2024. All rights reserved.