C “另一种方式”;使用指针访问结构的数组;
此代码接受struct Student数组,然后使用指针显示它。 代码使用了不太常见的方法。常用的方法显示在代码本身的单行注释中 但是,这种方法似乎存在一些问题,因为没有显示“百分比”的正确值。谁能告诉我这个问题的原因是什么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;
#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.