"使用指针"访问结构数组的替代方式;

时间:2017-12-17 19:24:09

标签: c arrays pointers struct

此代码接受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
     }
}

2 个答案:

答案 0 :(得分: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 );
      }
}

输出:

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.                                                                                                                                                                                                                             

答案 1 :(得分:0)

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

  

任何两个连续组件之间可能出现孔或填充   在结构布局中的最后一个组件之后如果必要的话   允许在内存中正确对齐组件。位模式   出现在这样的洞中是不可预测的,可能会有所不同   结构在一个结构内的结构或随着时间的推移。

据说它通常更清晰,更易读,更容易在结构中阅读(&p[i].grade ..)。简单易懂。