目录
一、结构体定义
结构体是C语言中一种重要的数据类型,该数据类型由一组称为成员(或称为元素)的不同数据组成,其中每个成员可以具有不同的类型。结构体通常用来表示类型不同但是又相关的若干数据。
结构体组成:结构体由结构体标签tag 、结构体成员member 、结构体变量var组成。
struct tag
{
member-list;
}variable-list;
注意:
结构体类型与结构变量是两个不同的概念,其区别如同int类型和int变量的区别一样。
int x=10;
struct student stu;
结构类型中的成员名,可以与程序中的变量同名,它们代表了不同的对象,互不干扰
int main()
{
int id=10;
char name='a';
}
结构类型中的数据项,既可以是基本数据类型也可以是结构体类型(struct) 。
( 基本数据类型是byte,short,int,long,float,double,boolean,char。 )
二、结构体类型及其定义初始化
首先声明结构体类型,接着定义和初始化结构体变量。
struct student{
int ID;
char name;
}stu;
注:这里的stu表示变量名 。一个变量后边加点表示为结构体, 一个结构体可以有很多字段 用点隔开表示变量的不同字段。
stu.ID =20;
如果要再定义一个变量,这时需要加上struct。
struct san a; //利用struct声明san是一个类型名(类似int)
使用typedef可以简化结构体的类型名 struct
typedef struct{
int ID;
char name;
}stu;
注:这里的stu表示一个别名 ,因为别名的存在,结构体名可省。(这里省略了student)
stu san;
san.ID =666;
不加typedef与加了typedef最大的区别在于:后者在定义结构体变量时可以省写struct。
若struct san {}这样来定义结构体的话。在申请node 的变量时,需要这样写,struct san n;
若用typedef,可以这样写,typedef struct san{}SAN; 。在申请变量时就可以这样写,SAN n;
一般使用typedef同时定义结构类型和结构指针类型,如:
1.分开定义
struct Data {
int a;
int b;
int c;
};// 先定义结构体
typedef struct Data *PData; // 再用 typedef 定义指针
2.一起定义
typedef struct Data {
int a;
int b;
int c;
} Data, *PData ;
如果没有typedef,那么就只能定义结构体变量,不能定义结构体指针类型。
// 定义两个结构体类型的指针变量
struct node{
int value;
data* next;
}*data1,*data2;
// 上面的写法等价于
data1 = new data(); // new()的返回值是指针
data2 = new data(); // new()的返回值是指针
结构体指针
- 通过指向结构变量的指针来访问(修改)结构变量的成员,与直接使用结构的效果一样。一般来说,如果指针变量pointer已指向结构变量var,则以下两种形式等价:
(1)var.成员
(2)pointer->成员
注意:
(1)分量运算符左侧的运算对象,只能是结构变量,不能是指针
(2)指向运算符左侧的运算对象,只能是指向结构变量(或结构数组)的指针,否则都出错。
#include<stdio.h>
typedef struct student {
int ID;
char name;
}stu;
int main() {
int ID = 001;
stu sat = { 444,'a' };
printf("stu.id=%d,stu.name=%c\n", sat.ID, sat.name);
stu* pi = &sat;
pi->ID = 333;
printf("stu.id=%d,stu.name=%c\n", sat.ID, sat.name);
return 0;
}
结果如下:
结构体数组
数组里存放的是结构体
struct student{
int ID,age;
}stu[10];
使用如下:
stu[0].ID = 20;
stu[0].age = 18;
stu[1].ID = 15;