L6:struct AND union
struct
1.空结构体的大小?用gcc编译链接后 空结构体占用0个字节 ,出来一个问题 如果定义两个空结构体 则两个变量占用相同的地址空间。
如果用g++编译链接 执行 ->占用1个字节,两个变量占用不同的地址空间。
2.柔性数组:数组大小待定的数组(产生斐波那契数列)
#include <stdio.h>
#include <malloc.h>
typedef struct _soft_array
{
int len;
int array[];
}SoftArray;//sizeof(SoftArray) =4 //只有len有存储空间
SoftArray* create_soft_array(int size)
{
SoftArray* ret = NULL;
if( size > 0 )
{
ret = (SoftArray*)malloc(sizeof(*ret) + sizeof(*(ret->array)) * size);
ret->len = size;
}
return ret;
}
void fac(SoftArray* sa)
{
int i = 0;
if( NULL != sa )
{
if( 1 == sa->len )
{
sa->array[0] = 1;
}
else
{
sa->array[0] = 1;
sa->array[1] = 1;
for(i=2; i<sa->len; i++)
{
sa->array[i] = sa->array[i-1] + sa->array[i-2];
}
}
}
}
void delete_soft_array(SoftArray* sa)
{
free(sa);
}
int main()
{
int i = 0;
SoftArray* sa = create_soft_array(10);
fac(sa);
for(i=0; i<sa->len; i++)
{
printf("%d\n", sa->array[i]);
}
delete_soft_array(sa);
return 0;
}
union 只分配 最大域的空间,所有域共享该空间
注意是小端模式还是大端模式
L7:enum 及typedef
enum 用来定义常量
enum 是真正的常量,和#define定义的不同
只能用来定义int,只能去定义时的离散值
enum Color
{
GREEN,
RED =2,
BLUE //BLUE =3;
};
int main()
{
printf("%d\n",GREEN); // 默认0 1
printf("%d\n",RED); // 默认1 2
printf("%d\n",BLUE); // 默认2 3
return 0
}
typedef
1.用于给一个已经存在的数据类型重命名
2.并没有产生新的类型
3.typedef重定义的类型不能进行unsigned 和signed 扩展