复合数据类型


1.三种基本的复合数据
 (1)联合:union:联合是一个能在 同一个存储空间里(但不同时)存储不同类型数据的数据类型。联合的大小取决于它所存储的数据中的最大的一个数据。
复合数据类型_第1张图片 复合数据类型_第2张图片
写一段代码判断是大端字节序还是小端字节序
//return value 1: LSB 0: MSB
int is_isb(void)
{
  union byteorder
    {
      int a;
      char b;
    }byte;
    byte.a == 0x12345678;
    if(byte.b == 78)
      return 1;
    else
      return 0
} 
指针写法:
//return value 1: LSB 0: MSB
int is_lsb(void)
{
  unsigned int a = 0x12345678;
  unsigned char *p = unsigned char * &a;
  if(*p == 0x78)
     return 1;
  else
     return 0;
}
  
 (2)枚举:enum:可以使用枚举类型声明表示整数常量的符号名称
 (3)结构体:
是否可以这样赋值
struct _st_student student;
student = (.name = "hello");这样是不允许的。例如对数组char arr[11]="Helloworld"这样是可以的,但这样写char arr[11];arr="Hellorworld"字符串是不可以这样赋值的。Helloword并没有赋值给arr,而是把“Helloworld”的地址给了arr。arr永远指向arr[11]数组的首地址,不能指向“Helloword”地址,字符串的赋值不能直接用等号赋值,只有在定义的同时初始化才能赋值。如果要把“Helloword”复制给arr[11],可以用strncpy(arr, "Helloworld", 11)
2.typedef:用来定义一种新的数据类型
typedf与define的区别:
#define PCHAR char *
PCHAR a,b;=char * a,b;a是char *类型,b是char类型
typedf char *  pchar;
pchar a,b;=char *a,*b;
结构体对齐:
sizeof(st_struct1)=8
sizeof(st_struct2)=12
结构体数组:
结构体指针:
typedef struct _st_student
{
  char name[32];
  int  gender;
  int  agee;
  st_score *score;
}st_student;

typedef struct _st_score
{
  float math;
  float chinese;
  float english;
}st_score;
st_student student;
st_student *ptr = &student;
student.name:访问student中的name;
student.score->math:访问指针中的成员要用到箭头
ptr->name:通过ptr指针访问student中的成员要用到箭头;
(变量用.+变量名,指针用箭头)
结构体嵌套:
结构体传参:
//结构体传参
st_student  increase_age(st_student  student)
{
     student.age ++; 
     return student;
}

st_student  student;
student = increase_age(student);
//指针传参
st_student increase_age(st_student *student)
{
  student->age ++;
}

st_student student;
increse_age(&student);
函数指针与回调函数:( http://blog.csdn.net/men_wen/article/details/52701416(个人觉得不错))




你可能感兴趣的:(复合数据类型)