建网站有哪些文件夹wap网站现在还有什么用
建网站有哪些文件夹,wap网站现在还有什么用,用源码搭建网站,农林牧渔行业网站建设乐观学习#xff0c;乐观生活#xff0c;才能不断前进啊#xff01;#xff01;#xff01; 我的主页#xff1a;optimistic_chen 我的专栏#xff1a;c语言 点击主页#xff1a;optimistic_chen和专栏#xff1a;c语言#xff0c; 创作不易#xff0c;大佬们点赞鼓… 乐观学习乐观生活才能不断前进啊 我的主页optimistic_chen 我的专栏c语言 点击主页optimistic_chen和专栏c语言 创作不易大佬们点赞鼓励下吧~ 文章目录 前言1.结构体类型的声明2.结构的自引用3.结构体内存对齐3.1对齐规则3.2为什么存在内存对⻬?3.3修改默认对齐数 4.结构体实现位段4.1什么是位段4.2位段的内存分配4.3位段的使用 完结 前言
前面的博客学习了整形和浮点型在内存中的存储接下来学习计算结构体的大小之前博客提及过结构体C语言操作符之神秘我们这篇博客将深入学习结构体的具体内容。
1.结构体类型的声明
结构是⼀些值的集合这些值称为成员变量。结构的每个成员可以是不同类型的变量。 结构的声明 struct tag
//关键字 结构体名称{member-list;//成员列表}variable-list;//变量列表结构的特殊声明 //匿名结构体类型
struct
{int a;char b;float c;
}x;警告匿名的结构体类型如果没有对结构体类型重命名的话基本上只能使⽤⼀次。
2.结构的自引用
在结构中包含⼀个类型为该结构本⾝的成员是否可以呢
struct Node
{int a;struct Node next;
};但是我们要计算该结构体的大小仔细分析其实是不⾏的因为⼀个结构体中再包含⼀个同类型的结构体变量这样结构体变量的⼤⼩就会⽆穷的⼤是不合理的。 正确的自引用方法 struct Node
{int a;struct Node* next;//指针
};3.结构体内存对齐
3.1对齐规则 1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处 2.其他成员变量要对⻬到某个数字对⻬数的整数倍的地址处。 对⻬数 编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。 3.结构体总⼤⼩为最⼤对⻬数结构体中每个成员变量都有⼀个对⻬数所有对⻬数中最⼤的的整数倍。 4.如果嵌套了结构体的情况嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处结构体的整体⼤⼩就是所有最⼤对⻬数含嵌套结构体中成员的对⻬数的整数倍。 注 VS 中默认的值为 8 Linux中?gcc?没有默认对⻬数对⻬数就是成员⾃⾝的⼤⼩ 练习 1 struct S
{char c1;//1char c2;//1int i;//4
};
int main()
{printf(%zd\n, sizeof(struct S));//8
}练习 2嵌套 struct S1
{double d;char c;int i;
};
struct S
{char c1;struct S1 s3;double d;
};
int main()
{printf(%zd\n, sizeof(struct S));
}3.2为什么存在内存对⻬?
平台原因(移植原因) 不是所有的硬件平台都能访问任意地址上的任意数据的某些硬件平台只能在某些地址处取某些特定类型的数据否则抛出硬件异常。性能原因 数据结构(尤其是栈)应该尽可能地在⾃然边界上对⻬。原因在于为了访问未对⻬的内存处理器需要作两次内存访问⽽对⻬的内存访问仅需要⼀次访问。 *假设⼀个处理器总是从内存中取8个字节则地址必须是8的倍数。如果我们能保证将所有的double类型的数据的地址都对⻬成8的倍数那么就可以⽤⼀个内存操作来读或者写值了。否则我们可能需要执⾏两次内存访问因为对象可能被分放在两个8字节内存块中。 总体来说结构体的内存对⻬是拿空间来换取时间的做法。 那在设计结构体的时候我们既要满⾜对⻬⼜要节省空间 或许让占⽤空间⼩的成员尽量集中在⼀起是一个不错的方法
struct S1
{char c1;int i;char c2;
};
struct S2
{char c1;char c2;int i;
};
int main()
{printf(%zd %zd, sizeof(struct S1), sizeof(struct S2));
}3.3修改默认对齐数 #pragma 这个预处理指令可以改变编译器的默认对⻬数 #pragma pack(1)
struct S
{char c1;//1char c2;//1int i;//4
};
int main()
{printf(%zd\n, sizeof(struct S));//8
}4.结构体实现位段
4.1什么是位段 位段的成员必须是 int、unsigned int 或signed int 在C99中位段成员的类型也可以选择其他类型。位段的成员名后边有⼀个冒号和⼀个数字。 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 12;s.c 3;s.d 4;printf(%d, sizeof(struct S));
}运行结果为什么是8呢这要我们了解位段的内存分配
4.2位段的内存分配 位段的空间上是按照需要以4个字节 int 或者1个字节 char 的⽅式来开辟的。 位段涉及很多不确定因素位段是不跨平台的注重可移植的程序应该避免使⽤位段。 总结 跟结构相⽐位段可以达到同样的效果并且可以很好的节省空间但是有跨平台的问题存在。
4.3位段的使用
位段的⼏个成员共有同⼀个字节这样有些成员的起始位置并不是某个字节的起始位置那么这些位置处是没有地址的。内存中每个字节分配⼀个地址⼀个字节内部的bit位是没有地址的。 所以不能对位段的成员使⽤操作符这样就不能使⽤scanf直接给位段的成员输⼊值只能是先输⼊放在⼀个变量中然后赋值给位段的成员。
struct A
{int _a : 2;int _b : 5;int _c : 10;int _d : 30;
};
int main()
{struct A sa { 0 };//scanf(%d, sa._b); //这是错误的//正确的⽰范int b 0;scanf(%d, b);sa._b b;return 0;
}完结
本次博客到此结束 祝开心每一天~~~ 最后觉得博客有帮助可以点点关注支持一下期待下次博客~~~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89875.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!