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 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
1天前
|
算法 编译器 C语言
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL(下)
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL
4 0
|
1天前
|
编译器 C语言 C++
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL(上)
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL
5 0
|
1天前
|
编译器 C语言 C++
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)(下)
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)
5 0
|
1天前
|
Java 编译器 C#
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)(上)
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)
11 0
|
6天前
|
人工智能 测试技术 C语言
C语言学习
C语言学习
16 1
|
7天前
|
存储 C语言
C语言中定义结构体类型变量的深入探索
C语言中定义结构体类型变量的深入探索
11 0
|
7天前
|
C语言
C语言三角形类型判断
C语言三角形类型判断
|
7天前
|
存储 编译器 C语言
【C语言】判断字符类型的三种方法
【C语言】判断字符类型的三种方法
87 0
|
7天前
|
存储 C语言
C语言变量类型
C语言变量类型
|
7天前
|
存储 编译器 C语言
初识C语言——详细入门(系统性学习day4)
初识C语言——详细入门(系统性学习day4)