结构体详解
结构体基本用法:
结构体就是把相同或者不同类型的便利放到一起,这和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);
就可以将其调换位置了