现在的位置: 首页 > 综合 > 正文

c语言结构体的学习

2013年08月20日 ⁄ 综合 ⁄ 共 2643字 ⁄ 字号 评论关闭

一,什么是结构体? 

 与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;
}

 由结果可知

结构变量.成员名
(*结构指针变量).成员名
结构指针变量->成员名

这三种用于表示结构成员的形式是完全等效的。

抱歉!评论已关闭.