结构体详解

结构体基本用法:

  结构体就是把相同或者不同类型的便利放到一起,这和C++中的类很像,但没有c++那么复杂,C语言中的结构体申明如下:

struct student           //结构体名
{
    char   name[10];     //姓名
    int    number;       //编号
    int    grade;        //成绩
};

申明很简单,其内存是按顺序放置的。

下面需要注意的几点:

1.申明时不能初始化(为什么后面会讲)

2.申明只是申明一个结构体,是不能使用的

3.获取结构体大小可以用sizeof(struct student)

4.结构体可以嵌套定义

5.结构体大小必须是所有成员变量大小的整数倍

一般我们会使用新定义类型来代替结构体,其实就是给结构体起一个新的名字

typedef  struct student
{
     char     name[10];
     int      number;
     int      grade;
}STU;

STU stu1={"张三",001,95};//定义一个stu1结构体变量,并进行初始化
注意:只有在定义的时候才能一起初始化,一旦定义了之后,不能一起初始化,但是可以分别初始化,为啥之后不能初始化,主要原因是因为结构体变量是按顺序存储的。

这样STU表示的实际就是结构体,具体可以参考typedef用法。

结构体既然申明了那怎么使用了,这里我们必须定义一个结构体变量,注意是结构体变量,也就是定义一个变量,这里的变量的类型是结构体,因此结构体申明部分其实就是申明一个新的变量类型,因此结构体是一个类型,不是变量,所以这也就是为啥申明的时候里面不能进行初始化的原因。下面举个例子来使用结构体:

我们引用结构体是可以这样引用:
stu1.name="李四";
stu1.number=002;
stu1.grade=100;
上面的引用方式是成员引用,也就是普通变量方式引用,还有一种引用就是结构体指针引用,这两种引用的方式有很大不同,后面会讲到。
指针引用时必须申明一个结构体指针,就像在整型变量中使用指针一样,我们需要先定义一个整型指针变量,然后使用它,这里也是一样。
STU  *stu2;   //定义一个stu2结构体指针变量

上面不能进行初始化,因为其实质是一个指针,不能像变量一样可以一起初始化(当然,指针实质还是变量,但是其使用不一样,所以一般说指针还是指指针变量)

既然是指针,那么必须指向一个内存地址,因此指针变量使用之前必须指向一块特定的内存地址,结构体指针也不例外。那我们怎样初始化结构体指针呢

第一种方式用动态分配内存的方式:

stu2=(STU*)malloc(STU);

第二种方式使用结构体变量间接方式:

stu2=&stu1;

这样结构体stu2指向的就是stu1的首地址。

结构体高级用法:

  在函数中,如果参数是结构体,那么又该怎样使用呢,其实我们使用结构体和使用变量是一样的,定义如下

void swap(STU stu1,STU stu2)
{
int exchange=0;
exchange = stu1.grade; stu1.grade
=stu2.grade;
stu2.grade=exchange;
/****** ...... ******/ }

 这样就可以使用结构体变量了,但是请思考下面代码结果:

STU stu3={"王五",003,80};
swap(stu1,stu3);

 执行这个函数两个结构体中的grade会交换么?结果是不会。这里就和函数中讲解的是一样的,那么我们怎么才能将其交换呢,在普通函数中给的方法是使用指针,因此这里我们同样可以使用指针来操作,我们必须将函数的形参定义为结构体指针变量。如下:

STU swap(STU *stu1,STU *stu2)
{
    int exchange=0;
    exchange = stu1->grade;
    stu1->grade=stu2->grade;
    stu2->grade=exchange;

}

这样我们使用

swap(&stu1,&stu3);

就可以将其调换位置了

 

posted @ 2019-04-20 14:30  LSWen  阅读(408)  评论(0编辑  收藏  举报