一,什么是结构体?
与Java中的class相似,结构体也是对现实对象的抽象,例如一个学生,我们在计算机中可以把其抽象为拥有姓名,年龄,性别,学号等成员的对象,来对其进行描述而对应的成员也可由基本数据类型进行表示。名字为char , 年龄为 int ,性别为char。。这样可以看出这样一组数据有不同类型的数据进行表示,不能用数组来进行存储,所以c语言出现了另一种构造数据类型,结构(structure)叫做结构体。由于数组中的各元素都是等长的,为了编译的方便,结构体成员会自动对齐(vc默认为4个字节,可以由需要进行调节) 所以Boolean变量是最浪费内存的。而且,因为它是一种构造的数据类型,那么就像函数一样,使用之前必须先对其进行定义。
struct 结构体名
{ 成员项;
};
eg:定义学生结构体。
struct stu
{
int id;
char name[];
char sex;
};
二, 如何定义结构体?
1, 先定义结构体,再定义结构变量。
eg:
struct stu //stu 是结构名
{
int id;
char name[];
char sex;
};
struct stu boy1, boy2; //boy1,boy2 为stu结构变量。
2 ,定义结构体的同时定义结构变量。
struct stu
{
int id;
char name[];
char sex;
} boy1 ,boy2;
3,直接定义结构变量(匿名结构体用的很少)。
struct
{
int id;
char name[];
char sex;
}boy1, boy2;
匿名结构体只能在声明的后面直接更上结构体变量。
如何调用呢? 结构体变量名.成员名。
boy1.id boy2.sex
三 ,结构变量的赋值、
一,动态的赋值
#include<stdio.h>
int main()
{
struct stu
{ int num;
char *name;
char sex;
int score;
} boy1,boy2;
printf("input sex and scor\n" );
scanf("%c %d" , &boy1.sex , &boy1.score);
boy2 = boy1;
printf("%c %d" ,boy2.sex , boy2.score);
return 0;
}
2,静态的赋值
#include<stdio.h>
int main()
{
struct stu
{ int num;
char *name;
char sex;
int score;
} boy1,boy2 ={1,“wang er” ,‘M’,33.3}; //在定义时进行花括号赋值。
printf("input sex and scor\n" );
scanf("%c %d" , &boy1.sex , &boy1.score);
boy2 = boy1;//与Java里对象之间的赋值一样。
printf("%c %d" ,boy2.sex , boy2.score);
return 0;
}
四,结构体数组的定义。
数组可以存放相同类型的元素,同样数组也可以存放结构类型的变量。因此,可以构成结构型数组。
现实中,经常用结构数组来表示具有相同数据结构的一个群体。(在Java中也就是把同一个对象的引用放入到一个这个对象类型的数组中)
struct stu
{ int num;
char *name;
char sex;
int score;
} boy[5];
定义了一个结构数组boy,共有5个元素,boy[0]--boy[4] ,每个数组元素都具有struct stu的结构形式,对结构数组可以进行初始化赋值
struct stu
{ int num;
char *name;
char sex;
} boy[5] =
{
{1, "mm",'m'},
{2,"cc",'c'},
{3,"dd",'d'};
};
eg:计算平均成绩和不及格的人数。
struct stu
{
int score;
}boy[5]={
{1},
{2},
{3},
{4},
{5};
}
int main()
{
int i,c=0;
float ave,s=0;
for(i=0;i<5;i++)
{
s+=boy[i].score;
if(boy[i].score<60) c+=1;
}
printf("s=%f\n",s);
ave=s/5;
printf("average=%f\ncount=%d\n",ave,c);
}
五,结构体指针变量。
一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。通过结构指针即可访问该结构变量,这与数组指针和函数指针的情况是相同的。 结构指针变量说明的一般形式为: struct 结构名 *结构指针变量名
例如,在前面的例题中定义了stu这个结构,如要说明一个指向stu的指针变量pstu,可写为:
struct stu *pstu;
当然也可在定义stu结构时同时说明pstu。与前面讨论的各类指针变量相同,结构指针变量也必须要先赋值后才能使用。
赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。如果boy是被说明为stu类型的结构变量,则:
pstu=&boy
是正确的,而:
pstu=&stu
是错误的。
结构名和结构变量是两个不同的概念,不能混淆。结构名只能表示一个结构类型,编译系统并不对它分配内存空间。只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。因此上面&stu这种写法是错误的,不可能去取一个结构名的首地址。有了结构指针变量,就能更方便地访问结构变量的各个成员。
其访问的一般形式为:
(*结构指针变量).成员名
或为:
结构指针变量->成员名
例如:
(*pstu).num
或者:
pstu->num
应该注意(*pstu)两侧的括号不可少,因为成员符 . 的优先级高于*。如去掉括号写作*pstu.num则等效于*(pstu.num),这样,意义就完全不对了。下面通过例子来说明结构指针变量的具体说明和使用方法。
#include<stdio.h>
struct stu
{
int num;
char *name;char sex;
} boy1 ={1, "mm",'m'} , *pstu ;
int main()
{ pstu = &boy1;
printf("%d", boy1.num);
printf("%d", (*pstu).num);
printf("%d", pstu->num);
return 0;
}
由结果可知
结构变量.成员名
(*结构指针变量).成员名
结构指针变量->成员名
这三种用于表示结构成员的形式是完全等效的。