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

简介: =============================================================================struct A{   char array[100];   //array不知道在哪里呢?只是告诉c语言编译器有这么一种类型结构。

=============================================================================
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下示例代码:

 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));
=============================================================================

我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
2月前
|
存储 编译器 C语言
【C语言】判断字符类型的三种方法
【C语言】判断字符类型的三种方法
83 0
|
2月前
|
存储 C语言
C语言变量类型
C语言变量类型
|
2月前
|
存储 编译器 C语言
初识C语言——详细入门(系统性学习day4)
初识C语言——详细入门(系统性学习day4)
|
2月前
|
存储 数据处理 C语言
C语言类型的变量
C语言类型的变量
18 1
|
2月前
|
存储 编译器 C语言
c语言中char的作用类型
c语言中char的作用类型
35 0
|
2月前
|
编译器 C语言
c语言中long的作用类型
c语言中long的作用类型
33 0
|
2月前
|
编译器 程序员 开发工具
c语言从入门到实战——在系统学习C语言之前所需要了解的知识
C语言是一种通用的、过程式的计算机编程语言,支持结构化编程、词汇变量作用域和递归等功能,其设计提供了低级别的存取权限,并且要求程序员管理所有的内存细节。C语言的基本构成包括数据类型(如整型、浮点型、字符型等)、运算符(如算术运算符、关系运算符、逻辑运算符等)、控制结构(如顺序结构、选择结构、循环结构等)以及函数等。此外,C语言还提供了指针的概念,这是其他许多编程语言所不具备的。指针是一个变量,其值为另一个变量的地址,通过指针可以间接访问和操作内存中的数据。C语言也支持数组、结构体、联合体等复合数据类型,以及文件操作、动态内存分配等高级功能。
52 0
C4.
|
2月前
|
存储 C语言
C语言的共用体类型
C语言的共用体类型
C4.
16 0
|
2月前
|
存储 C语言
通俗易懂的学习C语言中输入一组数并找出其最大值
通俗易懂的学习C语言中输入一组数并找出其最大值
|
14天前
|
存储 C语言
C语言中定义结构体类型变量的深入探索
C语言中定义结构体类型变量的深入探索
8 0