结构体
概念
相比较int float等基本类型,只能保存单一的数据,如果某个数据节点包含很多个类型,比如学生信息包含名字(字符串),年龄(int),成绩(double),可以单独定义三个变量:
char name[20];
int age;
double score;
但是当操作某个学生信息时,这三个变量都有的操作,如果信息过多,那么有可能会造成误操作或者漏操作非常的不方便。
如何把这些数据组合在一起构成一个类型呢?那就是结构体即通过一个语法结构将这些数据类型包在一起,这样操作就一块操作了,非常的方便,如下所示
struct Node //struct 是关键字 Node是名字 大括号内是结构体成员
{
char name[20];
int age;
double score;
}; //注意结尾要加分号,不加会报错
整个这个结构是一个数据类型,跟int double一样,类型本身不占空间,用这个类型定义变量时变量占空间。
定义变量
规则:类型 + 变量名
//struct Node no; //声明结构体变量,类型名固定
struct Node no1 = { "xiaoming",26,99.9 }; //依次初始化给成员
struct Node no2 = { "xioahua" }; //初始化部分元素,其它为0
struct Node* pno = &no1; //指针对象指向合法空间
成员访问
普通变量用 . 指针变量用-> 叫取成员运算符
printf("%s %d %.1lf\n",(&no1)->name,no1.age,no1.score);
printf("%s %d %.1lf\n",(*pno).name, pno->age, pno->score);
记住一个规则:地址访问用-> 普通变量用.
成员赋值
strcpy(no1.name, "xiaojia"); //字符串必须使用循环或者strcpy函数赋值,不能用=
no1.age = 99;
no1.score = 98.9;
互相赋值
结构体变量可以直接互相赋值,同一个结构体其内存模型排布是一样的
struct Node no1 = { "xiaoxing",26,99.9 };
struct Node* pno ;
struct Node no4 ;
no4 = no1;
no4 = *pno;
复合文字
规则:(类型){赋的值}
struct Node no6 = (struct Node){ "xiaotian",66,77.7 };
无名结构体
结构体可以没有名字,如下所示
struct //没有名字,无法通过名字定义结构,体变量使用受限制。
{
char name[20];
int age;
double score;
}no7 = { "xiaoming",26,99.9 },*pno7; //只能在这里定义变量,有名字的也可以在这里定义变量
结构体成员
指针成员
struct Node
{
struct Node* next; //可以是当前结构体类型指针
struct Node no; //不可以是当前结构体类型变量
};
如果是当前结构体类型的变量,此结构体就会出现悖论,结构体大小无法确定,指针的大小是确定的4字节或8字节,所以类型可以是指针
函数成员
结构体是不可以放函数的,但是可以放函数指针
int fun(void)
{
printf("i am fun\n");
}
struct Node1
{
int (*pfun)();
};
结构体大小
算字节大小,用sizeof计算,这里并不是单纯的将结构体成员元素大小之和相加,涉及到内存对齐的知识,我们会用sizeof就可以
规则:sizeof(类型) 或 sizeof(变量名)
struct Node no1 = { "xiaoming",26,99.9 };
printf("%zd\n", sizeof(struct Node));
printf("%zd\n", sizeof(no1));
以上个人理解,如有疑问欢迎留言,也可加微信,拉进学习讨论群:weixin:756115657(qq同号)