结构体

结构体

头文件

#include<stdio.h> #include<stddef.h>

声明结构体

//声明一个学生类型,是想过学生类型来创建学生变量 //描述学生:属性-名字+电话+性别+年龄 struct Stu { char name[20]; char tele[12]; char sex[20]; int age; }s4,s5,s6; struct Stu s3;//全局变量 int main() { //创建的结构体变量 struct Stu s1; struct Stu s2; return 0; }

匿名结构体类型

struct { int a; char c; }sa; struct { int a; char c; }*psa; int main() { psa=&sa;//非法的 return 0; }

结构体的自引用

struct Node { int date; struct Node* next; }; int main() { return 0; } typedef struct Node { int date;//4 struct Node* next;//4/8 }Node; int main() { struct Node n1; Node n2; return 0; }

结构体的初始化

struct T { double weight; short age; }; struct S { char c; struct T st; int a; double d; char arr[20]; }; int main() { struct S s = {'c',{55.6,30},100,3.14,"hello bit"}; printf("%c %lf %d %d %lf %s\n",s.c,s.st.weight,s.st.age,s.a,s.d,s.arr); return 0; }

结构体内存对齐

struct S1 { char c1; int a; char c2; }; struct S2 { char c1; char c2; int a; }; struct S3 { double d; char c; int i; }; struct S4 { char c1; struct S3 s3; double d; }; int main() { struct S1 s1 = {0}; printf("%d\n",sizeof(s1)); struct S2 s2 = {0}; printf("%d\n",sizeof(s2)); struct S3 s3 = {0}; printf("%d\n",sizeof(s3)); struct S4 s4 = {0}; printf("%d\n",sizeof(s4)); return 0; } #pragma pack(4) //设置默认对齐数为4 struct S { char c1; double d; }; #pragma pack() //取消默认对齐数 int main() { struct S s; printf("%d\n",sizeof(s)); return 0; }

写一个宏,计算结构体中某变量相对于首地址的偏移 offsetof()宏的实现、

struct S { char c; int i; double d; }; int main() { //offsetof(); printf("%d\n",offsetof(struct S,c)); printf("%d\n",offsetof(struct S,i)); printf("%d\n",offsetof(struct S,d)); return 0; }

结构体传参

struct S { int a; char c; double d; }; void Init(struct S* ps) { ps->a = 100; ps->c = 'w'; ps->d = 3.14; } //传值 Print1(struct S tmp) { printf("%d %c %lf\n",tmp.a,tmp.c,tmp.d); } //传址(推荐) Print2(const struct S* ps) { printf("%d %c %lf\n",ps->a,ps->c,ps->d); } int main() { struct S s = {0}; Init(&s); Print1(s); Print2(&s); /*s.a = 100; s.c = 'w'; s.d = 3.14; printf("%d\n",s.a);*/ return 0; }

位段 - 二进制位 为了节省空间

struct S { int a:2; int b:5; int c:10; int d:30; //后面数字不能大于32 }; //47bit - 6个字节*8 = 48bit int main() { struct S s; printf("%d\n",sizeof(s));//8个字节 return 0; }

位段的内存分配

struct S { char a:3; char b:4; char c:5; char d:4; }; int main() { struct S s={0}; s.a = 10; s.b = 20; s.c = 3; s.d = 4; return 0; }

__EOF__

本文作者bumper
本文链接https://www.cnblogs.com/bumper/p/17605568.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   bumper  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示