C语言结构体详解

结构体

概念

相比较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同号)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南侠客(上海)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值