刘小汶

路漫漫其修远兮,吾将上下而求索。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

结构体:可以由多个不同类型的数据构成

数组:只能存放一种数据类型

  1. 也是一种数据类型;构造类型;数组也是一种构造类型;
  2. 数组同时只能存放一种数据类型;
  3. 字符串存放的两种方法:字符串数组和指针数组;
  4. 结构体:可以由多个不同类型的数据构成;
  5. 第一步定义结构体类型;第二步是根据结构体类类型,定义结构体变量;
  6. struct Person{ int age;double height;char *name;};定义了person结构体类型;里面的变量可以成员或属性;
  7. char *name;是指针变量存放地址;
  8. struct Person p;根据结构体类型,定义结构体变量;
  9. struct Person p={20,1.55,"jack"};
  10. p.age=30;代表给age赋值;有点面向对象的味道;
  11. 只能在定义结构体变量的同时给它赋值;因为结构体名是一个地址;不能随便改变结构体名的地址;如错误写法:struct Person p2;p2= {30,1.67,"jake"};正确写法:struct Person p2= {30,1.67,"jake"};也可以写成:struct Person p2= {.height=1.55,.age= 20,.name="jake"};

 

结构体内存分析;从上往下分配;

  1. 定义结构体类型的时候没有定义变量,所以没有分配存储空间;如struct Date{int year;int month;int day;};这一句就没有分配存储空间;
  2. 结构体所占用的字节是结构体类型中成员的字节和;
  3. struct Date是一个结构体类型,还没有结构体变量;
  4. 查看字节的地址:printf("%p - %p - %p\n",&d1.year,&d1.month,&d1.day);
  5. 结构体变量赋值给结构体变量,会将d1所有成员的值对应地赋值给d2的值;
  6. 补齐算法;(对齐算法)结构体占用的字节数必须是最大成员字节的倍数;
  7. struct Student{int age;char *name;};所以这个由16个字节;

结构体注意点和其他用法:

  1. 定义结构体类型不分配存储空间;变量类型写左边;变量名写右边
  2. struct Student{int age;double height; char *name;}stu;这句代码写了两个意思;其中定义了结构体类型;还利用新定义好的类型来定义结构体变量;(定义类型的同时定义变量);这是定义变量的第二种方式;
  3. 结构体类型不能重复定义;
  4. 不写结构体类型名的方法;struct {int age;char *name;}stu;第三种方法;
  5. 三种定义结构体变量的方法:先定义类型,再定义变量;定义类型的同时定义变量;定义了类型的同时定义变量(省略了类型名称)
  6. 结构体类型有作用范围;程序员自定义的一般都有范围限制;
  7. 如果想写一个类型在任何地方都能用,那么需要把它在程序外面;
  8. 在全局可以定义一个结构体;在函数内部也可以重复定义一个结构体;

结构体数组;

  1. 之前有指针数组;字符串数组;
  2. 类似积分排行榜;struct RankReord{int no;char *name;int score;}
  3. 结构体数组的类型写法:struct RankRecord records[3]={{1,"jack",5000},{2,"jim",500},{3,"jake",300}};
  4. 在使用for循环输出给用户看:for(int i = 0;i<3;i++){printf("%d\t%s\t%d\n",records[i].no,recores[i].name,records[i].score);}
结构体的嵌套
  1. 多次使用同一个结构体的时候使用;
  2. struct Date{int year;int month;int day;};     struct Student{int no;struct Date birthday;struct Date ruxueDate;}    struct Student stu={1,{200,9,10},{2012,9,10}};
  3. 输出:printf("year=%d,month=%d,day=%d\n",stu.birthday.year,stu.birthday.month,stu.birthday.day);
  4. 指针变量指向结构体;struct Student *p;p=&stu;
  5. 用了指针之后,访问方式的变化;
  6. printf("age=%d,no=%d\n",(*p).age,(*p).no);
  7. 第三种方式访问:printf("age=%d,no=%d\n",p->.age,p->.no);
  8. ->是用在指针结构体身上的;->的作用是直接找到我们p指向的结构体;
  9. p->age =30;直接这样就可以修改值;
  10. 指向结构体的指针的定义;struct Student *p;
  11. 利用指针访问结构体的成员;(*p).成员名称;p->成员名称;
  12. 共用体

posted on 2016-04-08 12:37  williamliuwen  阅读(2788)  评论(0编辑  收藏  举报