本文的主要内容是讲解C语言当中的结构体的两种声明以及结构体的无名声明方式。
首先我们先来说结构体。结构体本身是一种自定义的数据类型,它允许程序员去创造程序员想要的数据类型,它比起C语言自带的数据类型比如float,double,int,char来说有非常高的自由度,由结构体可以衍生出一些基础甚至是高级的数据结构(栈,队列,链表,树,二叉树,图等等,不过这不是本文的主要内容),接下来我们来看结构体的声明,代码如下:
struct student
{
int age;//成员变量
char name[20];//成员变量
char work[20];//成员变量
};
其中struct是声明结构体的关键字,student是我们给这种新的数据类型赋予的名字,这样就声明了一种我们自定义的结构体类型。而其中的age,name,work都是student这种类型里面的变量,我们把它们称为student的成员变量,成员变量需要变量名+‘.’去访问,这个我们之后再讲,而使用它的方式很简单,把它当成一种数据类型来使用就行了。就像我们在声明一个整形变量x的时候会使用以下语句:
int i = 0;
我们想要使用结构体变量也是直接数据类型+名字就行了,例如声明一个student类型的变量,代码如下:
student s1 = { 22,"xxx","programer"};
这里也涉及到了结构体变量的初始化,结构体在声明的时候和C语言自带的数据类型无异,但是在初始化的时候需要使用:结构体变量名={成员变量1,成员变量2....成员变量n}的声明方式,赋值的顺序需要严格按照结构体声明时候成员变量的顺序一一声明,上述例子中age与22严格对应,name与"xxx"严格对应,work与"programer"严格对应。
如果结构体中嵌套了其他结构体,则在声明的时候需要在{}中嵌套{},如下:
struct student
{
int age;//成员变量
char name[20];
char work[20];
};
struct Class
{
student s1;
int num;
char character[40];
};
这里结构体Class中嵌套了结构体student,那么结构体Class在初始化的时候需要用{}把student初始化的所有内容括起来,代码如下
int main()
{
Class A = { {22,"xxx","student"},27,"山不向我走来,我自向山走去" };
}
在声明结构体变量A的成员变量s1的时候,由于s1是结构体student,所以在声明时需要用{}把s1的声明部分括起来。
结构体构建好之后,声明的地方可以有很多,如下
struct student
{
int age;//成员变量
char name[20];
char work[20];
}s1,s2,s3;
student s4;
student s5;
int main()
{
student s6;
student s7;
}
这里的s1,s2,s3,s4....s7都是结构体student的变量,唯一区别就是s6,s7是申明在main函数里面的局部变量,剩下的都是全局变量。
既然结构在声明的时候就可以创建结构体变量,那么有一种情况特殊,就是没有名字的结构体,如下:
struct
{
int age;//成员变量
char name[20];
char work[20];
}s1,s2,s3;
结构体是没有名字的,而且无法声明,只能在声明结构体本身的时候对结构体变量s1,s2,s3进行声明。在main()函数中也可以正常赋值和使用,不会报错。
除此之外,没有名字的结构体可以有很多,哪怕成员变量完全一样,两个结构体之间也互不等价,互不影响
struct
{
int age;//成员变量
char name[20];
char work[20];
}s1,s2,s3;
struct
{
int age;//成员变量
char name[20];
char work[20];
}a1,a2,a3;
如上,这里有两个无名结构体,但是此时我们取s1的地址和a1的地址:
二者完全不同,哪怕直接让s1=a1,编译器也是直接报错:
说明声明方式完全相同的两个无名结构体类型也是两种完全不一样的结构体,不能等价。
接下来我们来讲结构体的另一种声明方式,typedef声明
typedef struct student
{
int age;
int score;
char name[20];
}stu,Stu,Student,STUDENT;
上面就是typdef来定义结构体的声明,student仍旧是结构体类型的名字,但是这里的stu,Stu,Student,STUDENT和上文中只用struct定义时候的意义完全不一样!!一定要区分开
用typedef定义结构体的时候}}后面跟的是这种结构体的别名,用这些别名也可以声明结构体student
typedef struct student
{
int age;
int score;
char name[20];
}stu,Stu,Student,STUDENT;
int main()
{
stu s1;
Stu s2;
Student s3;
STUDENT s4;
}
而只用struct声明的时候}后面跟的是结构体变量,是直接实例化的对象,如下:
struct student
{
int age;
int score;
char name[20];
}stu,Stu,Student,STUDENT;
int main()
{
stu.age = 20;
Stu.age = 35;
Student.age = 50;
STUDENT.age = 5;
}
总结:结构体一共就两种声明方式和一种特殊的无名声明方式。
第一种是:
struct student
{
int age;
int score;
char name[20];
}stu,Stu,Student,STUDENT;
第二种是:
typedef struct student
{
int age;
int score;
char name[20];
}stu,Stu,Student,STUDENT;
还有一种特殊的无名声明是
struct
{
int age;//成员变量
char name[20];
char work[20];
}s1, s2, s3;
这种声明方式只能在声明时创建结构体变量,但是赋值和使用不受任何影响,只是无法在其他地方声明该结构体变量而已。
好了以上就本文的全部内容了,这里是站长李蔚,喜欢的话不妨点个赞,您的认可就我最大的动力~~如果想要学习更多关于C语言的内容,可以微信公众号/知乎/CSDN关注我,我是站长李蔚,一个专注于C/C++的程序员。