前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c语言基础学习09_关于复合类型的复习

c语言基础学习09_关于复合类型的复习

作者头像
黑泽君
发布2018-10-11 15:59:46
3230
发布2018-10-11 15:59:46
举报
文章被收录于专栏:黑泽君的专栏

============================================================================= struct A {   char array[100];   //array不知道在哪里呢?只是告诉c语言编译器有这么一种类型结构。是一种语法形式,不要误解。   int a; };

struct B {   char *p = malloc(100);   //所以不能这样写!   nt a; };

int main() {   struct A a;    //此时的array在栈里面。   a.a;

  struct A *p = malloc(sizeof(struct A));    //此时的array在堆里面。此时只有一个堆。   p->a;   //只有一个堆的时候可以用箭头->。

  return 0; } -------------------------------------- struct C    //占用1个字节,至少1个字节。 {   char a : 2;   char b : 4; };

struct D {   char a : 10;   //错误的语法,char不能超过8个bit。   char b : 4; };

struct F    //占用8个字节。 {   char a : 2;   int b : 4; }; ----------------------------------------------------------------------------- struct ABC {   int a;   int b; };

struct ABC abc1 = { 1, 2 }; struct ABC abc2 = abc1;    //浅拷贝,就是一个简单内存拷贝而已。 -------------------------------------- char array[100] = "hello"; char array2[100]; array2 = array;    //不能这么赋值,因为数组名是一个常量,不能作为左值的。 -------------------------------------- struct STR {   char array[100]; };

struct STR str1 = {"hello"}; struct STR str2; str2 = str1;   //此时str2里面的array的值和str1里面的array值是一样的。因为str2和str1是一个变量名,可以作为左值的。 ----------------------------------------------------------------------------- 数组最大的缺点是:如果往数组的两个成员之间插入新的数据,代价很大。因为它的内存是连续的。 而使用堆中的指针变量,只需要添加下,然后让指针重新做一个指向即可。好处:不仅可以做一个有特别多成员的结构,同时还可以自由地去删除、添加元素。 如下图所示:

-----------------------------------------------------------------------------

联合体的常用功能:做可变类型。因为他可以放很多类型,在同一时刻,只有一种类型。 类似于:javascript中好多变量是没有数据类型的。c语言可以通过联合体来实现。 (没有数据类型等价于有好多好多数据类型) linux下示例代码:

代码语言:javascript
复制
 1 #include <stdio.h>
 2 
 3 union A
 4 {
 5     int a;
 6     //double b;
 7     char b;
 8 };
 9 
10 int main()
11 {
12     union A a;
13     a.a = 0;
14     a.b = 100;
15     printf("%d\n", a.a);    //100
16 
17     return 0;
18 }

-----------------------------------------------------------------------------

注意:不要把一个庞大的结构体作为函数的形参,因为在栈里面一定会有一个结构体变量赋值的过程。就是把实参的值赋值给形参,实际上是一个内存拷贝,代价很大。

-----------------------------------------------------------------------------

#define PAI 3.14 double a = PAI; -------------------------------------- 常量是个有限的范围时,一般用枚举enum。 -------------------------------------- typedef struct STR S;   //这样S就和int类似了,就成了一个具体的数据类型了。 S s1; sizeof(S); S *p = malloc(sizeof(S)); =============================================================================

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档