[C学习]结构体

来源:互联网 发布:软件漏洞挖掘教程 编辑:程序博客网 时间:2024/05/20 05:22
 

基本类型:如int ,float...

构造类型:如数组,结构体...

应用环境:有时将不同类型的数据组合成一个有机的整体,以便于引用.数据是相互联系的,要反应它们的联系就不能分开处理.

形式:struct  结构体类型名//不是变量名,类似于int ,float..

   {};//要加上分号,

不带变量的结构说明不占内存空间,结构类型集中放在一个文件中,需要时#include

定义的3种形式:

1>先声明结构体,再定义变量名

struct student//相当于一个整体,

{

  int num;

 char name[20];

};

struct student stu1,stu2;//不但声明变量是一个结构体,而且是一个定义的student的特殊结构体.

2>声明同时定义变量

如:struct student

{

 int num;

 char name[20];

}student1,student2;//直接写到分号里.

3>直接定义结构体变量

如: struct       //此外无类型名称

   {

    int num;

            char name[20];    

          }student;//缺点.只能在这里定义这个类型的变量,没有类型名,不能在别地再定义变量.

2>结构体的引用

结构体变量名.成员名

"."是成员运算符,优先级最高,自左向右结合.

可以引用结构体成员的地址,也可引用结构体的地址,结构体变量名,代表这个结构体的第一个成员的地址.

3>结构体数组

数组中存放的元素都是结构体.

定义:

如: struct student

{

int num;

char name[20];

};

struct student stu[3];//定义一个数组stu,它有3个元素,每个元素都是struct student类型.

4>指向结构体类型的指针

结构体变量的指针就是这个变量所占内存的起始地址.可用一个指针变量来指向结构体变量,该指针的值就是这个结构体变量的起始地址.指针也可以用来指向结构体数组.

struct student stud_1;

struct student stu[3];

struct student *p;//指向这个结构体类型的指针

p=&stud_1;

如果用指针来访问stud_1.num;

(*p).num//一定要加上(),因为"."的优先级高于*,p会先与.结合,无意义.

新定义的一个运算符."->"

将(*p).num改写为p->num,其中"->"表示结构体指针要取的成员,称为指向运算符.

结构体变量名.成员名;

(*p).成员名;

p->成员名;

比较如下:

p->n               取出p所指结构体中成员名为n的值

p->n++          取出p所指结构体中成员名为n的值,再++

++p->n          取出p所指结构体中成员名为n的值,先加1,再使用

////////////////////////////////////////////////

指向结体体数组的指针

p=stu;stu是struct student stu[3];

(++p)->num    取下一个结构体变量的成员num

(p++)->num    取当前结构体变量的成员num,然后p再指向下一个结构体变量.

注意:定义p是一个指向struct student类型数据的指针变量.它用来指向一个struct student结构的变量,它指向如stu[0],stu[1]的起始地址,它不能指向这个结构中的成员.

p=stu[0].num;(为什么不是p=&stu[0].num??) 编译将提示类型不匹配,如果要将某一成员地址赋给p,可用强制类型转换.先将成员地址换成p的类型.如p=(struct student *) stu[0].num;此时p的值是stu[0]中num的起始地址,printf("%d",*p)输出的是stu[0]中num的值,但是p仍然是原来的类型,即p+1;p会偏移一个结构体的长度.

结构体作参数,是值传递,将结构体变量所在的内存单元的值顺序传递给形参,形参也必须是同类型的结构体.这样系统的开销大.

而用指向结构体变量的指针作参数,传递的是地址.

结构体用来处理链表.

///////////////////////////////////////////////////////////

结构体的应用

结构体与函数

a>结构体用作函数的参数

 结构体作函数的形参,接受实参的结构体顺序传来的值.会建立一个临时的结构体,这样会系统带来很大的开销.

b>函数的返回值是结构体

 如用结构体作为参数,它是形参,值的修改对实参不起作用.如果要保留这个修改过后的结构体,那么可将它作为返回值保存下来.

 也可用于新申请一个结构体空间,然后返回它.

c>函数的返回值是指向结构体的指针

 用于新申请一个结构体,返回它的指向结构体起始地址的指针.

struct student
{
   long num;
   char name[20];
};
struct student* new()
{
  struct student *aux;
  aux=(struct student*)malloc(sizeof(struct student));
  if(aux==null)exit;
  else return aux;
}//其中aux就是一个指向结构体类型的指针,可通过这个指针对这个新申请的空间进行操作.

原创粉丝点击