码迷,mamicode.com
首页 > 其他好文 > 详细

结构体

时间:2015-09-08 18:31:20      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

一、结构体的基本概念

1、构造类型

    由已有的数据类型构成的类型

2、结构体与数组的区别

2.1、数组

  • 多个同种类型的数据构成的一种类型
  • 特点:只能存放一种类型的数据

2.2、结构体

  • 用于存放表示某种特定含义的一组数据
  • 它是对数据的封装。(函数是对功能的封装)
  • 结构体的好处:
    • 提高代码的可读性
    • 提高数据易用性
    • 提高代码可维护性

3、结构体语法

3.1 定义

  1. struct 结构体类型名称{
  2. 成员类型 成员名称
  3. }; //必须加分号
  1. struct Person{
  2. int age;
  3. char sex;
  4. double height;
  5. double weight;
  6. char *name;
  7. }

3.2 通过结构体类型定义结构变量

  1. struct 结构类型名称 结构体变量名称;
  1. struct Person person;

3.3 访问结构体成员

  1. person.age = 10;
  2. person.sex = ‘M‘;
  3. person.weight=20.2;
  4. person.height=1.2;
  5. person.name="小明";
  6. printf("age=%d,sex=%c,weight=%.2lf,height=%.2lf,name = %s\n",person.age,person.sex,person.weight,person.height,person.name);

二、结构体的初始化

1 先定义结构体变量,然后初始化

分开赋值
  1. struct Person p1;
  2. p1.age = 10;
  3. p1.name="xx";
  4. p1.height:1.3;
整体赋值
  1. struct Person p1
  2. p1 = (struct Person){20,"小明",2.0}

2 定义结构体变量的同时进行初始化

  1. struct Person p2 = {15,"小红",1.5}

3 同种类型的结构体之间可以相互赋值

  1. p1 = p2;

三、结构体定义的多种方式

1 先定义结构体类型,然后定义结构体变量

  1. void test(){
  2. struct Person{
  3. int age;
  4. double height;
  5. };
  6. struct Person p1;
  7. }

2 定义结构体类型的同时,定义结构体变量

  1. void test1(){
  2. struct Person{
  3. int age;
  4. double height;
  5. }p1,p2={20,1.75};
  6. p1 = (struct Person){10,1.2};
  7. }

3 定义匿名的结构类型的同时定义结构体变量

  1. truct Person{
  2. int age;
  3. double height;
  4. }p1,p2={20,1.75};
注:匿名结构类型的变量
  •         不支持整体赋值
  •         结构类型不能重复使用

四、结构体定义的作用域

1 在函数内部,结构类型作用域就如同局部变量一样,即作用为大括号内

  1. int main(){
  2. struct Person{
  3. int age;
  4. };
  5. struct Person p={10};
  6. printf("age=%d\n",p.age );
  7. {
  8. struct Person p={20};
  9. struct Monkey{
  10. char *name;
  11. };
  12. }
  13. struct Monkey m;
  14. }
技术分享

2 在外边下义的结构类型像全局变量的作用域

作用域:从我的那一行开始直到文件结束
注意点:结构类型不能声明
  1. #include <stdio.h>
  2. struct Person{
  3. int age;
  4. char sex;
  5. };
  6. int main(){
  7. struct Person p2;
  8. p2.sex = ‘s‘;
  9. p2.age = 10;
  10. return 0;
  11. }

3 内部定主我的结构体会覆盖名称相同的外部结构体

五 结构体的内存分析

1 结构体变量的地址就是第一个成员的地址

  1. #include <stdio.h>
  2. int main(){
  3. struct Date{
  4. int year;
  5. int month;
  6. int day;
  7. };
  8. struct Date date;
  9. printf("%p\n",&date);
  10. printf("%p\n",&date.year);
  11. }
运行结果
技术分享

2 结构体类型本身是不占存储空间的,就像int是不占用存储空间的一样

3 对于相同的数据类型的结构体所占用的存储空间为所有成员之和

  1. #include <stdio.h>
  2. int main(){
  3. struct Date{
  4. int year;
  5. int month;
  6. int day;
  7. };
  8. struct Date date;
  9. printf("%p\n",&date);
  10. printf("%p\n",&date.year);
  11. size_t size = sizeof(struct Date);
  12. printf("%lu\n",size);
  13. }
运行效果
技术分享

4 为了快速度访问数据,结构体内部有一个补齐算法

  • 默认情况下,它一定是战胜存储空间最大的成员的倍数
  1. struct Person{
  2. int age;
  3. char sex;
  4. };
  5. size_t size2 = sizeof(struct Person);
  6. printf("%lu\n",size2);
运行结果
技术分享
  • 也可以自己指定,但必须是2的位数,指定方法如下
  1. #include <stdio.h>
  2. #pragma pack(3)
  3. int main(){
报如下错误:
技术分享

六 结构体数组

结构体数组是指数组元素为结构体

1 定义结构体数组的语法

  1. 结构类型类型 数组名称[元素个数];

2 先定义结构体数组,然后初始化

  1. //一般情况下,结构体类型一般定义在函数外部
  2. struct Dog{
  3. char *name;
  4. int age;
  5. };
  6. int main(){
  7. //定义,结构体如果没有初始化,它里面都是垃圾值
  8. struct Dog dogs[5];
  9. //初始化
  10. dogs[0](struct Dog){"旺财",1};
  11. dogs[1].age=1;
  12. dogs[1].name="大黄";
  13. return 0;
  14. }

3 定义结构体数组的同时进行初始化

  1. struct Dog dogs[10] = {{"旺财",1},{"大黄",2},{"来福",3},{"小黑",4},{"小白",5}};
注:如何计算数组元素的实际个数
  1. int len = sizeof(dogs)/sizeof(struct Dog);

七 结构体指针

    结构体指针:指向结构体的指针

1 定义语法

  1. 指针所指数据类型 * 指针变量名称
  1. struct Student{
  2. char *name;
  3. int no;
  4. double score;
  5. };
  6. int main(){
  7. struct Student stu = {"小黑",60,59};
  8. //定义结构体指针
  9. struct Student *sp1;
  10. //赋值
  11. sp1 = &stu;
  12. //定义的同时进行赋值
  13. struct Student *sp2 = &stu;
  14. return 0;
  15. }

2 通过指针访问结构体成员

  • 第一种方法
  1. (*sp1).score = 60;
  • 第二种方法(推荐)
  1. sp2->name = "大白";
  2. sp2->no = 59;

八 结构体嵌套

    结构体嵌套:一个结构体内部可以有其他类型的结构体成员

1 定义

  1. //定义一个日期的结构体
  2. struct Date{
  3. int year;
  4. int month;
  5. int day;
  6. };
  7. //定义员工结构体,其中包括日期结构
  8. struct Employee{
  9. int num;
  10. char *name;
  11. struct Date birthday; //这就是结构体嵌套
  12. };

2 初始化

  1. struct Employee emp = {1,"八戒",{2015,9,8}};

3 注意点

  • 结构体不可以嵌套自己
  1. struct Person {
  2. char * name
  3. struct Person son;//这是不允许的
  4. };
  • 结构体可以嵌套自己类型的指针
  1. struct Person{
  2. char *name;
  3. struct Person *son; //这是可以的,可以嵌套自己类型的指针
  4. };

九 结构体函数

1 结构体变量作为函数的参数

  1. //结构体作为函数参数
  2. void printPerson(struct Person person){
  3. printf("name=%s,age=%d,height=%.2f\n",person.name,person.age,person.height);
  4. }
  5. int main(){
  6. struct Person p = {"小孩",1,0.2};
  7. printPerson(p);
  8. }
注:结构体作为函数的参数,是值传递
  1. //结构体作为函数参数
  2. void printPerson(struct Person person){
  3. printf("name=%s,age=%d,height=%.2f\n",person.name,person.age,person.height);
  4. }
  5. void changePerson(struct Person person){
  6. person.age = 30;
  7. }
  8. int main(){
  9. struct Person p = {"晋三",1,0.2};
  10. printPerson(p);
  11. changePerson(p);
  12. printPerson(p);
  13. }
运行结果
技术分享

2 结构体指针作为函数参数是地址传递

  1. //结构体作为函数参数
  2. void printPerson(struct Person person){
  3. printf("name=%s,age=%d,height=%.2f\n",person.name,person.age,person.height);
  4. }
  5. void changePerson2(struct Person *person){
  6. person.age = 30;
  7. }
  8. int main(){
  9. struct Person p = {"晋三",1,0.2};
  10. printPerson(p);
  11. changePerson2(&p);
  12. printPerson(p);
  13. }
技术分享

3 结构体数组作为函数参数是地址传递

  1. //写一个函数遍历结构体数组
  2. void printPersons(struct Person *persons,int len){
  3. for(int i=0;i<len;i++){
  4. printf("name=%s,age=%d,height=%.2f\n",persons[i].name,persons[i].age,persons[i].height);
  5. }
  6. }
  7. //更新
  8. void changePersons(struct Person *persons,int len){
  9. //省略...
  10. }
  11. int main(){
  12. struct Person ps[3]={{"小泉",2,0.3},{"晋三",2,0.3}};
  13. int len = sizeof(ps)/sizeof(struct Person);
  14. printPersons(ps,len);
  15. changePersons(ps,len);
  16. printfPersons(ps,len);
  17. }


捐赠我们
    良师益友工作室一直在致力于帮助编程爱好更加快速方便地学习编程,如果您对我们的成果表示认同并且觉得对你有所帮助,欢迎您对我们捐赠^_^。
    技术分享

结构体

标签:

原文地址:http://www.cnblogs.com/mentorStudio/p/4792457.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!