1. //
  2. // main.c
  3. // 结构体基本概念
  4. //
  5.  
  6. #include <stdio.h>
  7.  
  8. int main(int argc, const char * argv[]) {
  9. /*
  10. 基本数据类型: int double float char
  11. 构造类型: 数组/ 结构体
  12.  
  13. 数组: 是用于保存一组相同类型的数据
  14. 结构体: 是用于保存一组不同类型的数据
  15.  
  16. 要想保存人得数据, 就必须先定义变量
  17. 数据类型 变量名称;
  18.  
  19. 如何定义一个结构体变量
  20. 1.定义结构体类型
  21. 2.根据结构体类型, 定义结构体变量
  22.  
  23. 定义结构体类型的格式:
  24. struct 结构体类型名称
  25. {
  26. 属性;
  27. };
  28. */
  29.  
  30. // 1.定义结构体类型, 8 + 4 + 8个字节,结构体Person总共20个字节。
  31. struct Person
  32. {
  33. char *name; // char name[20];
  34. int age;
  35. double height;
  36. };
  37. // 2.定义结构体变量, int num;
  38. struct Person p;
  39. // 注意: 数组不能先定义再进行一次性的初始化, 所有下面的写法是错误的
  40. // p.name = "lnj"; name = {'l', 'n', 'j', '\0'}; 所以要用指针char *name。
  41. p.name = "lnj";
  42. p.age = ;
  43. p.height = 1.75;
  44.  
  45. /*
  46. 这时不允许的
  47. int nums[3];
  48. nums[0] = 998;
  49. nums[1] = 887;
  50. nums[2] = 789;
  51.  
  52. int nums[3];
  53. nums = {1, 3, 5}; */
  54.  
  55. return ;
  56. }
  1. //
  2. // main.c
  3. // 结构体初始化
  4.  
  5. #include <stdio.h>
  6.  
  7. int main(int argc, const char * argv[]) {
  8.  
  9. int nums[] = {, , };
  10. int nums[];
  11. nums[] = ;
  12. nums[] = ;
  13. nums[] = ;
  14. int nums[];
  15. nums = {, , }; // 错误
  16. int nums[] = {[] = };
  17. printf("nums[0] = %i\n", nums[]);
  18.  
  19. struct Dog
  20. {
  21. char *name;
  22. int age;
  23. double height;
  24. };
  25. // 1.定义的同时初始化
  26. struct Dog sd = {"wc", , 5.0};
  27.  
  28. // 2.先定义再初始化(逐个初始化)
  29. struct Dog sd1;
  30. sd1.name = "ww";
  31. sd1.age = ;
  32. sd1.height = 10.9;
  33.  
  34. // 3.先定义再初始化(一次性初始化)
  35. struct Dog sd2;
  36. // 特别注意: 结构体和数组有一点区别, 数组不能先定义再进行一次性的初始化, 而结构体可以
  37. // 只不过需要明确的告诉系统{}中是一个结构体而不是数组。
  38. sd2 = (struct Dog){"xq", , 8.8}; // 数组? 结构体?
  39.  
  40. // 4.指定将数据赋值给指定的属性
  41. struct Dog sd3 = {.height = 1.77, .name = "ww", .age = };
  42.  
  43. printf("name = %s, age = %i, height = %lf\n", sd3.name, sd3.age, sd3.height);
  44.  
  45. return ;
  46. }
  1. //
  2. // main.c
  3. // 结构体的内存存储细节
  4.  
  5. #include <stdio.h>
  6.  
  7. int main(int argc, const char * argv[]) {
  8.  
  9. // 1.定义结构体类型并不会分配存储空间
  10. struct Person{
  11. int age; //
  12. int height; //
  13. int width; //
  14. };
  15. // 2.只有定义结构体变量才会真正的分配存储空间,12个存储空间,
  16. struct Person sp = {, , };
  17. // 结构体第0个属性的地址就是结构体的地址
  18. printf("&sp = %p\n", &sp);//0x0,不是结构体的地址,
  19. printf("age = %p\n", &sp.age);//0xffd8
  20. printf("age = %p\n", &sp.height);//0xffdc
  21. printf("age = %p\n", &sp.width);//0xffe0
  22.  
  23. printf("size = %lu\n", sizeof(sp));//
  24.  
  25. int nums[] = {, , };
  26. // nums == &nums == &nums[0]
  27.  
  28. // 和数组一样, 结构体内存寻址从大到小, 存储数组是从小到大(先存储第0个属性, 再一次存储其它属性)
  29.  
  30. /*
  31. 结构体如何开辟存储空间
  32. 看上去, 结构体分配存储空间是将所有属性占用的存储空间的总和加在一起后再分配
  33. 注意:
  34. 其实结构体分配存储空间本质上并不是将所有属性占用的存储空间的总和加在一起后再分配
  35. 而是会获取结构体类型中占用内存最大的属性的大小, 然后取该大小的倍数
  36. (每次都开辟8个,所以都是8的倍数)
  37. 特例:
  38. 如果剩余的存储空间"不够"存储将要存储的数据, 那么就会重新开辟8个字节的存储空间, 并且将需要存储的数据放到新开辟的存储空间中
  39. 如果剩余的存储空间"够"存储将要存储的数据, 那么就不会开辟了
  40. */
  41. struct Person{
  42. //double height; // 8
  43. int age; // 4
  44. //int heigth; //
  45. double height; //
  46. char c; // 1
  47. //char *name; //
  48. };
  49. struct Person sp;
  50. printf("size = %lu\n", sizeof(sp)); //
  51. return ;
  52. }
  1. //
  2. // main.c
  3. // 结构体定义的方式
  4.  
  5. #include <stdio.h>
  6.  
  7. int main(int argc, const char * argv[]) {
  8. // 1.先定义结构体类型, 在定义结构体变量
  9. struct Person
  10. {
  11. int age;
  12. char *name;
  13. double height;
  14. };
  15. struct Person sp;
  16.  
  17. // 2.定义结构体类型的同时定义结构体变量
  18. struct Person
  19. {
  20. int age;
  21. char *name;
  22. double height;
  23. } sp;
  24. // 数据类型 变量名称
  25. sp.age = ;
  26. printf("age = %i\n", sp.age); //
  27.  
  28. struct Person sp1;
  29. sp1.name = "lnj";
  30. printf("name = %s\n", sp1.name);
  31.  
  32. // 3.定义结构体类型的同时定义结构体变量, 并且省略结构体名称
  33. // 如果在定义结构体类型的同时定义结构体变量, 那么可以省略结构体类型名称
  34. // 弊端: 由于结构体类型没有名称, 所以以后就不能使用该结构体类型
  35.  
  36. struct // 优点: 如果结构体类型只需要使用一次, 那么可以使用该方式。
  37. {
  38. int age;
  39. char *name;
  40. double height;
  41. } sp;
  42. sp.age = ;
  43. printf("age = %i\n", sp.age);
  44.  
  45. return ;
  46. }
  1. //
  2. // main.c
  3. // 结构体类型的作用域
  4.  
  5. #include <stdio.h>
  6. void test();
  7.  
  8. // 如果将变量写到函数或者代码块外面, 那么就不是局部变量, 而是全局变量
  9. // 全局变量的作用域是从定义的那一行开始, 直到文件末尾 (暂时这样理解)
  10. int num;
  11.  
  12. // 如果将结构体类型写在函数或者代码块外面, 那么结构体类型的作用域和全局变量一样, 从定义的那一行开始一直直到文件末尾
  13. // 相同作用域不能有同名的结构体类型
  14. struct Person
  15. {
  16. int age;
  17. char *name;
  18. double height;
  19. };
  20.  
  21. int main(int argc, const char * argv[]) {
  22. // int num = 10;
  23. num = ;
  24.  
  25. struct Person sp;
  26. return ;
  27. }
  28.  
  29. void test()
  30. {
  31. num = ;
  32. struct Person sp1;
  33. // num = 20;
  34. }
  35.  
  36. void demo()
  37. {
  38. struct Person
  39. {
  40. int age;
  41. char *name;
  42. double height;
  43. };
  44. int num = ;
  45.  
  46. {
  47. struct Dog
  48. {
  49. int age;
  50. char *name;
  51. };
  52. struct Dog sd;
  53.  
  54. // 在不同的作用域中可以有同名的局部变量, 如果访问采用就近原则
  55. int num = ;
  56. printf("num = %i\n", num);
  57.  
  58. // 在不同的作用域中可以定义同名的结构体类型 , 如果使用同名的结构体类型定义结构体变量, 采用就近原则
  59. struct Person
  60. {
  61. int age;
  62. char *name;
  63. double height;
  64. };
  65. struct Person sp = {, "lnj", 1.75};
  66.  
  67. }
  68. // num = 55;
  69. // struct Dog sd1;
  70.  
  71. struct Person sp;
  72. }
  73.  
  74. void test()
  75. {
  76. // 1.如果结构体定义在函数或者代码块中, 那么结构体类型的作用域和变量的作用域一样, 从定义的那一行开始, 一直到函数结束或者到代码块结束
  77. struct Person sp;
  78. }
  1. //
  2. // main.c
  3. // 指向结构体的指针
  4.  
  5. #include <stdio.h>
  6.  
  7. int main(int argc, const char * argv[]) {
  8. struct Person
  9. {
  10. int age;
  11. char *name;
  12. double height;
  13. };
  14.  
  15. struct Person sp = {, "lnj", 1.75};
  16.  
  17. sp.name = "lnj";
  18. sp.age = ;
  19. sp.height = 1.75;
  20.  
  21. // 定义了一个指向结构体的指针
  22. // *sip == sp
  23. struct Person* sip;
  24. sip = &sp; //sip是指针
  25.  
  26. // 注意: 报错的原因是因为.运算符的优先级比*高
  27. (*sip).name = "xxx";
  28. (*sip).age = ;
  29. (*sip).height = 1.95;
  30. printf("age = %i, name = %s, height = %lf\n", (*sip).age, (*sip).name, (*sip).height);
  31.  
  32. sip->age = ; //sip是指针
  33. sip->name = "oooo";
  34. sip->height = 2.1;
  35. printf("age = %i, name = %s, height = %lf\n", sip->age, sip->name, sip->height);
  36.  
  37. /*
  38. 如何定义指向结构体变量的指针
  39. 1.拷贝结构体类型 和 结构体变量名称
  40. 2.在类型和名称中间加上一颗心
  41.  
  42. 当指针指向结构体之后如何利用指针访问结构体
  43. 结构体变量名称.属性;
  44. (*结构体指针变量名称).属性;
  45. 结构体指针变量名称->属性;
  46.  
  47. */
  48.  
  49. return ;
  50. }
  1. //
  2. // main.c
  3. // 结构体数组
  4. //
  5. // Created by xiaomage on 15/6/14.
  6. // Copyright (c) 2015年 xiaomage. All rights reserved.
  7. //
  8.  
  9. #include <stdio.h>
  10.  
  11. int main(int argc, const char * argv[]) {
  12. // 要求定义变量保存公司中所有部门的绩效
  13.  
  14. struct Bumen
  15. {
  16. char *name;
  17. int count;
  18. double kpi;
  19. };
  20. struct Bumen ios = {"iOS", , 100.0};
  21. struct Bumen andorid = {"Andoird", , 99.0};
  22. struct Bumen php = {"php", , 88.0};
  23.  
  24. // 元素类型 数组名称[元素个数];
  25. struct Bumen bumens[] =
  26. {
  27. {"iOS", , 100.0}, //
  28. {"Andoird", , 99.0},
  29. {"php", , 88.0}
  30. };
  31. bumens[] = ios;
  32. bumens[].name = "iOSv587";
  33. bumens[].count = ;
  34. bumens[].kpi = 100.0;
  35.  
  36. printf("name = %s, count = %i, kpi = %lf\n", bumens[].name, bumens[].count, bumens[].kpi);
  37. return ;
  38. }
  1. //
  2. // main.c
  3. // 结构体的嵌套定义
  4.  
  5. #include <stdio.h>
  6.  
  7. int main(int argc, const char * argv[]) {
  8. /*
  9. struct Person
  10. {
  11. int age; // 年龄
  12. char *name; // 姓名
  13.  
  14. // 出生日期
  15. int year;
  16. int month;
  17. int day;
  18.  
  19. // 初始化时晨
  20. int HH; // 24小时
  21. int mm; // 分钟
  22. int ss; // 秒钟
  23.  
  24. // 入学时间
  25. int year2;
  26. int month2;
  27. int day2;
  28.  
  29. // 毕业时间
  30. int year3;
  31. int month3;
  32. int day3;
  33. };
  34. struct Person sp = {30, "lnj", 1986, 1, 15 , 15, 20, 8};
  35. */
  36. // 定义一个时间结构体类型
  37. struct Time
  38. {
  39. int HH;
  40. int mm;
  41. int ss;
  42. };
  43.  
  44. struct Date
  45. {
  46. int year;
  47. int month;
  48. int day;
  49. struct Time time;
  50. };
  51.  
  52. struct Person
  53. {
  54. int age;
  55. char *name;
  56.  
  57. // 出生日期
  58. struct Date birth;
  59. // 出生时间
  60. // struct Date time;
  61. // struct Time shic;
  62.  
  63. // 小学入学时间
  64. struct Date ruxue;
  65. // 小学毕业时间
  66. struct Date biye;
  67. // ....
  68. };
  69. struct Person sp =
  70. {
  71. ,
  72. "lnj",
  73. {
  74. ,
  75. ,
  76. ,
  77. {
  78. ,
  79. ,
  80.  
  81. }
  82. },
  83. {
  84. ,
  85. ,
  86.  
  87. },
  88. {
  89. ,
  90. ,
  91.  
  92. }
  93. };
  94.  
  95. // 注意: 如果结构体的属性又是一个结构体, 那么可以通过连续.的方式, 访问结构体属性中的属性
  96. // 如果结构体类型中的属性又是一个结构体, 那么赋值时候通过大括号{}赋值
  97. printf("year = %i, month = %i, day = %i\n", sp.birth.year, sp.birth.month, sp.birth.day);
  98.  
  99. return ;
  100. }
  1. //
  2. // main.c
  3. // 结构体和函数
  4.  
  5. #include <stdio.h>
  6. void change(int value);
  7. void change(struct Person value);
  8. void change(struct Person *p);
  9.  
  10. struct Person
  11. {
  12. int age;
  13. char *name;
  14. };
  15.  
  16. int main(int argc, const char * argv[]) {
  17.  
  18. struct Person sp = {, "lnj"};
  19. // 1.将结构体的属性传递给函数, 在函数中修改形参不会影响到实参
  20. printf("age = %i\n", sp.age); //
  21. change(sp.age);
  22. // 2.将结构体名称作为参数传递, 在函数中修改形参不会影响到实参
  23. // 结构体之间赋值是值传递, 系统会将A结构体的值 拷贝一份到 B结构体中
  24. change(sp);
  25. printf("age = %i\n", sp.age); //
  26.  
  27. struct Person sp1 = {, "lnj"};
  28. struct Person sp2 = sp1; // 结构体之间赋值是值传递, 相当于拷贝
  29. printf("sp1.age = %i\n", sp1.age); //
  30. sp2.age = ;
  31. printf("sp1.age = %i\n", sp1.age); //
  32. printf("sp2.age = %i\n", sp2.age); //
  33.  
  34. struct Person sp1 = {, "lnj"};
  35. printf("sp1.age = %i\n", sp1.age); //
  36. change(&sp1);
  37. printf("sp1.age = %i\n", sp1.age); //
  38.  
  39. return ;
  40. }
  41.  
  42. void change(int value){
  43. value = ;
  44. }
  45. void change(struct Person value){
  46. value.age = ;
  47. }
  48. void change(struct Person *p){
  49. p->age = ;
  50. }

c21---结构体的更多相关文章

  1. Go结构体实现类似成员函数机制

    Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...

  2. C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱

    一.前言 -孤独的路上有梦想作伴,乘风破浪- 二.页面值传递 (1)C#各页面之间可以进行数据的交换和传递,页面之间可根据获取的数据,进行各自的操作(跳转.计算等操作).为了实现多种方式的数据传递,C ...

  3. go语言结构体

    定义: 是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体. 成员: 每个值称为结构体的成员. 示例: 用结构体的经典案例处理公司的员工信息,每个员工信息包含一个唯一的员工编号.员工的名字. ...

  4. C语言中的结构体

    用户自己建立自己的结构体类型 1.  定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...

  5. C++_系列自学课程_第_12_课_结构体

    #include <iostream> #include <string> using namespace std; struct CDAccount { double bal ...

  6. java socket传送一个结构体给用C++编写的服务器解析的问题

    另一端是Java写客户端程序,两者之间需要通信.c++/c接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组.解决方法:c++/c socket 在发送结构体的时候其实发送的也是字 ...

  7. swift学习笔记3——类、结构体、枚举

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  8. HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. C语言结构体对齐

    1.结构体变量中的元素如何访问? (1)数组中元素的访问方式:表面上有2种方式(数组下标方式和指针方式):实质上都是指针方式访问.(2)结构体变量中的元素访问方式:只有一种,用.或者->的方式来 ...

  10. C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用

    类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...

随机推荐

  1. Oracle调整内存参后报ORA-00844和ORA-00851

    数据库服务器内存由16G增加为64G,为充分利用内存资源,对Oracle内存参数做了如下调整: SQL>alter system set sga_max_size=40960M scope=sp ...

  2. React+Dva

    Reducer reducer 是一个函数,接受 state 和 action,返回老的或新的 state .即:(state, action) => state Effect app.mode ...

  3. Android 第一行代码(第二版)分享

    今天从网上好不容易看到了别人转发的pdf版的 第一行代码通过下载我把它存在了百度云里面了与大家共享 http://pan.baidu.com/s/1bRztF4

  4. 【SQL】字符型函数

    1. ASCII ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统. 1) 返回 ...

  5. js 习题

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  6. Java基础学习笔记三 正则表达式和校验、Date、DateFormat、Calendar

    正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex).正则表达式是一个字符串,使用单个字符串来描述.用来定义匹配规则,匹配一系列符合某个句法规则的字符串.在 ...

  7. C# 常用语句

    var list = dt.AsEnumerable().Select(t => t.Field<string>("Bed")).ToList();Select( ...

  8. 第1章 面向对象的JavaScript

    针对基础知识的每一个小点,我都写了一些小例子,https://github.com/huyanluanyu1989/DesignPatterns.git,便于大家理解,如有疑问,大家可留言给我,最近工 ...

  9. [poj3565] Ants (二分图带权匹配)

    传送门 Description 年轻自然主义者比尔在学校研究蚂蚁. 他的蚂蚁以苹果树上苹果为食. 每个蚁群都需要自己的苹果树来养活自己. 比尔有一张坐标为 n 个蚁群和 n 棵苹果树的地图. 他知道蚂 ...

  10. Linux思维导图之文件压缩