本文目录一览:
c语言。结构体那边的求大师,,我就想问下面这个结构体,没有struct,也没有成员名,这是怎么回事,
如果用
typedef struct
{
.....;
}STREC;
// 这样定义结构体,定义结构体变量的时候就可以不用写struct;
初始化的时候只要按顺序填入初始值就可以了,不用写成员名的
c语言,显示结构体里的元素没有定义错误
#includestdio.h
#includestdlib.h
struct score
{char xh[10];
float bs;
float sj;
}*su;
void getscore(struct score *p)
{
int i;
printf("请输入学号");
gets(p-xh);
fflush(stdin);
while(1)
{
printf("请输入笔试成绩");
scanf("%f",p-bs);fflush(stdin);
printf("请输入上机成绩");fflush(stdin);
scanf("%f",p-sj);
if(p-bs=100p-sj=100p-bs=0p-sj=0) break;
}
}
void putscore(struct score *p)
{
printf("%s %f %f",p-xh,p-bs,p-sj);
}
main()
{
struct score *su=(struct score*)malloc(sizeof(struct score));
getscore(su);
putscore(su);
}
两种错误:
一个就是用指针引用成员变量的时候,-后面的没有写
另一个就是输入学号的字符串的时候,用gets就可以了,用scanf一个一个输字符,每次还要fflush(stdin)的。
c语言中如何定义一个结构体
结构体的定义如下所示,struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。在一般情况下,tag、member-list、variable-list这3部分至少要出现2个。
结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明。
扩展资料:
一、结构体作用:
结构体和其他类型基础数据类型一样,例如int类型,char类型,只不过结构体可以做成你想要的数据类型,以方便日后的使用。
在实际项目中,结构体是大量存在的,研发人员常使用结构体来封装一些属性来组成新的类型。由于C语言内部程序比较简单,研发人员通常使用结构体创造新的“属性”,其目的是简化运算。
结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。
二、结构体的大小与内存对齐:
结构体的大小不是结构体元素单纯相加就行的,因为我们主流的计算机使用的都是32bit字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效,也更方便。
所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素时就会相对更高效,这就是内存对齐的由来。每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。
程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
三、结构体的规则:
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
参考资料来源:百度百科-结构体