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