C “另一种方式”;使用指针访问结构的数组;

C “另一种方式”;使用指针访问结构的数组;,c,arrays,pointers,struct,C,Arrays,Pointers,Struct,此代码接受struct Student数组,然后使用指针显示它。 代码使用了不太常见的方法。常用的方法显示在代码本身的单行注释中 但是,这种方法似乎存在一些问题,因为没有显示“百分比”的正确值。谁能告诉我这个问题的原因是什么 #include<stdio.h> struct Student { char grade; int rollNumber; float percentage; }; typedef struct Student Student;

此代码接受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
     }
}
#包括
体类型
{
煤焦品位;
整数;
浮动百分比;
};
类型定义结构学生;
无效录取通知书(学生*);
无效显示数组(学生*);
int main()
{
学生朋友[3];
学生*p=我的朋友;
可接受度(p);
显示阵列(p);
}
无效受理费(学生*p)
{
int i=0;
对于(i=0;i<3;i++)
{
printf(“\n输入等级、卷号和百分比:\n”);
scanf(“%c%d%f”,
(p+i),
//&(p+i)->等级
//&p[i].等级
((学生*)((无符号整数)p+sizeof(char))+i),
//&(p+i)->卷数
//&p[i]
((学生*)((无符号整数)p+sizeof(char)+sizeof(int))+i)
//&(p+i)->百分比
//&p[i].百分比
);
}
}
无效显示数组(学生*p)
{
int i=0;
对于(i=0;i<3;i++)
{
printf(“\n级别为:%c.”,*(p+i));
//(p+i)->等级
//p[i].等级
printf(“\n卷号为:%d.”,*((学生*)((无符号整数)p+sizeof(字符))+i));
//(p+i)->卷数
//p[i]
printf(“\n百分比为:%.1f.”,*((学生*)((无符号整数)p+sizeof(char)+sizeof(int))+i));
//(p+i)->百分比
//p[i].百分比
}
}

您没有正确使用指针。最好的方法是按[i]索引它,并通过
操作符访问结构成员

这样你会得到一个更干净的代码。由于填充孔的原因,不建议您以这种方式进入结构内部

#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 );
      }
}

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

任何两个连续的组件或组件之间可能会出现孔或填充 在结构布局中的最后一个构件之后,如有必要 允许内存中的组件正确对齐。位模式 出现在此类孔中是不可预测的,可能与 结构到结构或在单个结构内随时间变化


可以说,它总是更干净、可读,并且更容易以我们通常的方式在struct中阅读(
&p[i].grade
)。让简单的事情变得简单

@sg7-嗯
p
初始化为指向
myFriends
的第一个元素@sg7 typedef用于将struct Student替换为Student。这一点尚不清楚-当您使用传统的
&p[i]时会出现什么问题。等级
等。?(你能构造一个?@OliverCharlesworth吗?@OliverCharlesworth这段代码编译时没有任何错误,除了最后一个printf语句外,运行得很好。如果使用“(p+i)->percentage”或“p[i].percentage”而不是“((学生)((无符号int)p+sizeof(char)+sizeof(int))+i”,则会打印正确的值。可能的重复项为
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.