结构体
一.定义:
一组变量的结合,这些变量之间可以毫无关联,类型各异,但大多情况下变量的存在都是为了描述一个事物。
二.关键字:
struct
三.使用场景:
要将一个大的变量当作一个原子,而这个变量本身却有着略微不同(属性相同但在数值上存在差别),需要对这个原子进行管理时,结构体便应运而生(在C语言中)。
例如:学校对学生的管理,将一个学生看作一个原子,而这些原子都有年龄,性别,年级…等的属性,但属于每个原子其属性的所携带的不同信息则成为其区分的标志。
四.声明与使用:
语法:
struct 结构体名称 //结构体类型
{
成员变量
}变量列表; //结构体变量名列表
//变量名就相当于 int ret; 这条语句中的ret一样
例如一个描述学生的变量:
1.只定义结构体类型,等到使用时在定义结构体变量
struct student
{
char name[20];姓名
char sex[5];//性别
int age;//年龄
int studentid[20];//学号
};
//需要使用时则需要单独定义变量名称
struct student first;//第一个学生
struct student second,third;//第二,第三个学生
//也可以如此定义(用法上与上边没有太大差别):
typedef struct student//类型重定义
{
char name[20];姓名
char sex[5];//性别
int age;//年龄
int studentid[20];//学号
}student;
//注意此时的student变为了一个变量类型,就如int一般
2.定义结构体类型时,同时定义结构体变量
struct student
{
char name[20];//
......
}first,second;
//这样定义后的first,second拿起来就直接可以使用
//使用方法如下
first={“zhangsan","nan",19, "1701"};
3.不定义结构体类型,直接定义结构体变量(不完全声明):
struct
{
char name[20];
......
}first,second;
//这种一个变量名只可使用一次
在这种定义方式下需要注意:
//结构体1.
struct
{
int a;
char b;
}x;
//结构体2.
struct
{
int a;
char b;
}ret,*p;
这俩个结构体为俩个类型的结构体因此代码
p=&x;
虽然可以执行,但其不合乎语法。就像把char型的地址赋给int型的指针;
五.自引用
自引用在链表的应用值得注意:
1.
typedef struct Node
{
int data;
Node* next;
}Node;
这个代码是有问题的,因为在类型重定义完成之前就使用了重定义之后的名称。应改为:
typedef struct Node
{
int data;
struct Node* next;
}Node;
struct Node
{
int data;
struct Node next;//在这里相当定义了一个struct Node型的next变量
//应改为struct Node* next;创建一个此类型的next指针
};
六.结构体传参
考虑到函数传参时压栈时,结构体自身看可能较大,导致性能下降的因素,尽量传地址。