1.全局变量和局部变量

局部变量:

    概念:定义函数内部变量

    定义格式:变量类型 变量名称;

    作用域:从定义那一行開始到所在代码块结束

    生命周期:从代码运行到定义的哪一行開始,到其所在的代码的结束为止

    特点:同样的代码块中不能够有同名的变量

         不同的代码块中能够有同名的变量。内部的变量会覆盖外部定义的变量

全局变量:

    概念:定义在函数外部变量

    定义:变量类型 变量名称 = 值;

    声明:变量类型 变量名称;

    特点:1、不能够反复定义,但能够反复声明

         2、局部变量能够与全局变量同名。在局部变量的作用域范围内。那么局部变量会覆盖全局变量

         3、假设未定义仅有声明,系统自己主动给它定义并将其初始化为0

    作用域:从定义的那一行開始。直到文件结束

生命周期:从程序启动開始。直到程序退出才消亡

  1. #include <stdio.h>
  2. int num;//声明
  3. int main(int argc, const char * argv[]) {
  4. printf("num = %d\n",num);
  5. int num = 20;
  6. printf("num = %d\n",num);
  7. {
  8. num = 40;
  9. int num = 10;
  10. printf("num = %d\n",num);
  11. num = 30;
  12. }
  13. printf("num = %d\n",num);
  14. return 0;
  15. }

2.结构体

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

  1、数组:多个同种类型的数据构成的那么一种类型

     特点:仅仅能存放一种数类型

  2、结构体:从来存放表示某种特定含义的一组数据

           它是对数据封装

           函数对功能封装

     优点:提高代码的可读性

          提高数据易用性

          提高代码可维护性

 

     定义结构体:

         1、定义结构类型

             struct 结构类型名称{

             成员类型 成员名称;

             ...

             };//必须加分号

         2、通过结构体类型定义结构变量

            struct 结构类型名称 结构体变量名称;

  1. #include <stdio.h>
  2. int main(int argc, const char * argv[]) {
  3.  
  4. // int scores[] = {59,60};
  5. // int 年龄 姓名 char * 性别 char 身高 double 体重 double
  6. // int age;
  7. // char sex;
  8. // double height;
  9. // double weight;
  10. // char *name;
  11. //
  12. // int ages[50];
  13. // char sex[50];
  14. // ....
  15. // 定义一个人结构体类型
  16. struct Person{
  17. int age;
  18. char sex;
  19. double height;
  20. double weight;
  21. char *name;
  22. };
  23. // int num;
  24. // int * pointer;
  25. // 定义结构体变量
  26. struct Person person;
  27. // 訪问结构体成员
  28. person.age = 10;
  29. person.sex = 'M';
  30. person.weight = 20.2;
  31. person.height = 1.2;
  32. person.name = "小明";
  33. printf("age = %d,sex = %c,weight = %.2lf,height = %.2lf,name = %s\n",person.age,person.sex,person.weight,person.height,person.name);
  34.  
  35. return 0;
  36. }



3.定义结构体的多种类型

  1. #include <stdio.h>
  2. /*
  3. 第一种方式
  4. 1、先定义结构体类型
  5. 2、定义结构变量
  6. */
  7. void test()
  8. {
  9.  
  10. struct Person{
  11. int age;
  12. double height;
  13. };
  14.  
  15. struct Person p1;
  16. }
  17.  
  18. /*
  19. 另外一种方式
  20. 定义结构体类型的同一时候定义结构变量
  21. */
  22. void test1()
  23. {
  24. struct Person{
  25. int age;
  26. double height;
  27. } p1,p2 = {20,1.75};
  28.  
  29. p1 =(struct Person){10,1.2};
  30.  
  31. printf("age = %d,height = %.2lf\n",p1.age,p1.height);
  32.  
  33. printf("age = %d,height = %.2lf\n",p2.age,p2.height);
  34. // 结构体类型定义是不能够重名的
  35. // struct Person{
  36. // int age;
  37. // double height;
  38. // } p3,p4 = {20,1.75};
  39. }
  40. /*
  41. 第三种方式
  42. 定义匿名的结构类型的同一时候定义结构体变量
  43. */
  44. int main(int argc, const char * argv[]) {
  45. struct{
  46. int age;
  47. char sex;
  48. } p1,p2 = {20,'M'};
  49. p1.age = 10;
  50. p1.sex = 'W';
  51. printf("age = %d,sex = %c\n",p1.age,p1.sex);
  52. p1 = p2;
  53. printf("age = %d,sex = %c\n",p1.age,p1.sex);
  54. //
  55. // p1 = (struct) {10,'w'};
  56. // 1、不支持总体赋值
  57. // 2、结构体类型不能反复使用
  58. struct{
  59. int age;
  60. char sex;
  61. } p3,p4 = {20,'M'};
  62. return 0;
  63. }

4.结构体作用域

   在函数内部,结构类型作用域就如同局部变量一样

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

   作用域:从定义的那一行開始直到文件的结束

   注意点:结构类型不能声明

   结构体类型的作用,除了不能声明以外。其它与普通变量一样

  1. #include <stdio.h>
  2. struct Person{
  3. int age;
  4. char sex;
  5. };
  6. int main(int argc, const char * argv[]) {
  7. struct Person p2;
  8. p2.sex = 's';
  9. p2.age = 10;
  10. struct Person{
  11. int age;
  12. };
  13. struct Person p = {10};
  14. printf("age = %d\n",p.age);
  15. {
  16. struct Person p = {20};
  17. struct Monkey{
  18. char *name;
  19. };
  20. }
  21. return 0;
  22. }



5.结构体数组

   结构体数组:数组元素为结构体数组

   定义结构体数组

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

   数组元素的类型 数组名称[元素个数];

  1. #include <stdio.h>
  2. //普通情况下结构体类型都是定义在函数的外部
  3. struct Dog{
  4. char *name;
  5. int age;
  6. };
  7. void test()
  8. {
  9. // int nums[] = {1,2,3,4};
  10. // 结构体假设没有初始化。它里面都是垃圾值
  11. // 第一种方式:向定义结构体数组然后初始化
  12. struct Dog dogs[5];
  13. dogs[0] = (struct Dog){"旺財",1};
  14. dogs[1].age = 1;
  15. dogs[1].name = "大黄";
  16. // 遍历结构体数组
  17. for(int i = 0;i < 5;i++)
  18. {
  19. printf("age = %d,name = %s\n",dogs[i].age,dogs[i].name);
  20. }
  21. }
  22. void test2()
  23. {
  24. // 定义结构体数组的同一时候进行初始化
  25. // 假设没有显式初始化的结构体。那么这个结构体中全部成员都会被初始化为0
  26. struct Dog dogs[10] = {{"旺財",1},{"大黄",2},{"来福",3},{"小黑",4},{"小白",5}};
  27. // 计算数组的元素个数
  28. int len = sizeof(dogs) / sizeof(struct Dog);
  29. for(int i = 0;i < len ;i++)
  30. {
  31. printf("age = %d,name = %s\n",dogs[i].age,dogs[i].name);
  32. }
  33.  
  34. }
  35. int main(int argc, const char * argv[]) {
  36. // test();
  37. tset2();
  38. return 0;
  39. }

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

6.结构体与指针

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

   指针所指向的数据类型 * 指针变量名称;

   结构类型 * 指针变量名称;

  1. #include <stdio.h>
  2. struct Student{
  3. char *name;//姓名
  4. int no;//学号
  5. double score;//成绩
  6. };
  7. int main(int argc, const char * argv[]) {
  8. struct Student stu = {"大木",60,59};
  9. // 定义结构体指针
  10. struct Student *sp1;
  11. sp1 = &stu;
  12. // 定义的同一时候进行初始化
  13. struct Student *sp = &stu;
  14. // 通过指针訪问结构体的成员的第一种方式
  15. (*sp).score = 60;
  16. // 另外一种方式(重点)
  17. sp->name = "小木";
  18. sp->no = 59;
  19. printf("name = %s,no = %d,score = %.2lf\n",stu.name,stu.no,stu.score);
  20.  
  21. return 0;
  22. }

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

7.结构体嵌套

       一个结构体内部能够有其它类型的结构体成员

 结构体嵌套的注意点:

   1、结构体不能够嵌套自己,不能有字节这样的类型的成员

   2、结构体能够嵌套自己类型的指针

  1. #include <stdio.h>
  2. //定义了一个日期的结构体
  3. struct Time{
  4. int hour; // HH
  5. int minute;//mm
  6. int second;//ss
  7. };
  8. struct Date{
  9. int year;
  10. int month;
  11. int day;
  12. struct Time time;
  13. };
  14. struct Employee{
  15. int no;
  16. char name[20];
  17. // 入职日期
  18. // int year;
  19. // int month;
  20. // int day;
  21. struct Date inDate;
  22. // 生日
  23. // int birthyear;
  24. // int birthmonth;
  25. // int birthday;
  26. struct Date birthday;
  27. // 离职日期
  28. // int goyear;
  29. // int gomonth;
  30. // int goday;
  31. struct Date outDate;
  32. };
  33. void test()
  34. {
  35. struct Employee emp = {1,"大幕",{2014,10,14,{12,12,12}},{1990,10,14},{2014,11,14}};
  36.  
  37. printf("no = %d,name = %s,入职日期 = %d-%d-%d %d:%d:%d\n"
  38. ,emp.no,emp.name,emp.inDate.year,emp.inDate.month,emp.inDate.day,
  39. emp.inDate.time.hour,emp.inDate.time.minute,emp.inDate.time.second);
  40. }
  41. struct Person{
  42. char *name;
  43. // struct Person son;
  44. struct Person *son;
  45. };
  46. /*
  47. 1.某班有5个学生,三门课。分别编写3个函数实现下面要求:
  48. (1) 求各门课的平均分;
  49. (2) 找出有两门以上不及格的学生,并输出其学号和不及格课程的成绩。
  50. (3) 找出三门课平均成绩在85-90分的学生,并输出其学号和姓名
  51. */
  52. int main(int argc, const char * argv[]) {
  53. struct Person father = {"father"};
  54. struct Person son = {"son"};
  55. father.son = &son;
  56. printf("son name = %s\n",father.son->name);
  57.  
  58. return 0;
  59. }

8.枚举

  枚举:一个一个列举出来

  枚举作用:消除魔法数字

  使用场景:当某个东西仅仅有那么几个取值时候就是用枚举

  定义枚举格式

     enum 枚举类型的名称{

     元素,//逗号

     ...

     };

   注意点:

   1、枚举类型定义中。全部元素都是整形常量

   2、枚举类型的本质就是整形

  1. #include <stdio.h>
  2. //定义性别枚举类型
  3. enum Sex{
  4. Man,
  5. Woman,
  6. Other
  7. };
  8.  
  9. //int Man = 10;//枚举定义之后,后面不可定义与成员同样变量
  10. void test()
  11. {
  12. // 在代码中出现的这样的表示特殊含义数字,我们魔法数字
  13. // int sex = 0;
  14. enum Sex sex;
  15. printf("%d\n",Man);
  16. int Man = 10;
  17. printf("%d\n",Man);
  18. // sex = 1;// 这里不能把要给数字赋值给一个枚举类型的变量,这样枚举存在的意义就没有了
  19. // Man = 1;
  20.  
  21. }
  22. // 能够指定枚举中每个元素值
  23. enum Season{
  24. Spring = 2,
  25. Summer,
  26. Autumn,
  27. Winter,
  28. SOther = 9
  29. };
  30. void PrintSeason(enum Season season)
  31. {
  32. switch (season) {
  33. case Spring: //Case后面的值务必与枚举中成员一致,不要出现魔法数字
  34. printf("春季\n");
  35. break;
  36. case Summer:
  37. printf("夏季\n");
  38. break;
  39. case Autumn:
  40. printf("秋季\n");
  41. break;
  42. case Winter:
  43. printf("冬季\n");
  44. break;
  45. case SOther:
  46. printf("不是地球上季节\n");
  47. break;
  48. default:
  49. break;
  50. }
  51. }
  52. int main(int argc, const char * argv[]) {
  53. printf("%d,%d,%d\n",Man,Woman,Other);
  54. printf("%d,%d,%d,%d\n",Spring,Summer,Autumn,Winter);
  55. enum Season season = Summer;
  56. PrintSeason(season);
  57.  
  58. return 0;
  59. }

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

9. typedef:

    给已有数据类型起别名   

   基本数据类型

   int char float double

   结构体

   枚举

   指针

      1、普通变量的指针

      2、结构体指针

      3、函数指针

   基本数据类型

  定义格式:typedef 已有数据类型 别名;

  1. #include <stdio.h>
  2. void testBaseType()
  3. {
  4. typedef int Int;
  5. Int num = 10;
  6. typedef Int Integer;
  7. Integer a = 20;
  8. printf("%d\n",a);
  9. }
  10. /*
  11. 给结构体类型起别名
  12. */
  13. void testStruct()
  14. {
  15. // 第一种方式:先定义结构体类型再给结构体类型起别名
  16. struct _Person{
  17. int age;
  18. char *name;
  19. };
  20. typedef struct _Person Person;
  21. Person p1 = {10,"小红"};
  22. printf("age = %d,name = %s\n",p1.age,p1.name);
  23. // 另外一种方式,定义结构体类型的同一时候给结构体类型起别名
  24. typedef struct _Dog{
  25. int age;
  26. char *name;
  27. } Dog;
  28. Dog dog = {1,"大黄"};
  29. // 第三种方式:定义匿名结构体类型的同一时候给结构体起一个别名
  30. typedef struct{
  31. int age;
  32. char * name;
  33. } Cat;
  34. Cat cat = {1,"tom"};
  35. }
  36. //给枚举起别名
  37. void testEnum()
  38. {
  39. // 1、先定义枚举类型然后给枚举起别名
  40. enum _Sex{
  41. Man,
  42. Woman,
  43. Other
  44. };
  45. typedef enum _Sex Sex;
  46. Sex sex = Man;
  47. // 2、定义枚举类型的同一时候给枚举类型起一个别名
  48. typedef enum _Season{
  49. Spring,
  50. Summer
  51. } Season;
  52. Season season = Spring;
  53. // 3、定义匿名枚举类型同一时候给枚举起一个别名
  54. typedef enum {
  55. Cong,
  56. Suan,
  57. Jiang
  58. } TiaoWei;
  59. TiaoWei zuoLiao = Cong;
  60. }
  61. //4、指针类型
  62. //4.1 基本数据类型的指针
  63. void testTypedefBasicPointer()
  64. {
  65. typedef int * IntPointerType;
  66. int a = 10;
  67. IntPointerType p = &a;
  68. *p = 20;
  69. printf("%d\n",a);
  70. }
  71. //4.2 给结构体类型的指针起别名
  72. void testTypedefStructPointer()
  73. {
  74. typedef struct {
  75. char *name;
  76. int age;
  77. } Person;
  78. typedef Person * PersonPointerType;
  79. Person p = {"张三",10};
  80. PersonPointerType pp = &p;
  81. typedef struct _Cat{
  82. char *name;
  83. int age;
  84. } Cat, * CatPointerType;
  85. Cat cat = {"小猫",1};
  86. CatPointerType catPointer = &cat;
  87. printf("name = %s,age = %d\n",catPointer->name,catPointer->age);
  88. }
  89. //4.3 给枚举类型的指针起别名
  90. void testTypedefEnumPointer()
  91. {
  92. // 先定义枚举类型
  93. enum _Sex{
  94. Man,
  95. Woman,
  96. Other
  97. };
  98. typedef enum _Sex * SexPointer;
  99. enum _Sex sex = Man;
  100. SexPointer sexPointer = &sex;
  101. *sexPointer = Woman;
  102. printf("%d\n",sex);
  103. }
  104. //4.4 给函数指针起别名
  105. int sum(int num1,int num2){
  106. return num1 + num2;
  107. }
  108. int minus(int num1,int num2){
  109. return num1 + num2;
  110. }
  111. //给函数指针起别名
  112. //typedef 指针所指向的函数的返回值类型 (*函数指针类型别名)(所指向的函数的形參列表);
  113. void testTypedefMethodPointer()
  114. {
  115. // int (*sumPointer)(int num1,int num2) = sum;
  116. //
  117. // int (*minusPointer)(int num1,int num2) = minus;
  118. typedef int (*MethodPointerType)(int num1,int num2);
  119. MethodPointerType sumPointer = sum;
  120. MethodPointerType minusPointer = minus;
  121. int rs = sumPointer(10,20);
  122. printf("rs = %d\n",rs);
  123. }
  124. //了解
  125. void testTypedefArrayPointer()
  126. {
  127. char names[][10] = {"xtf","zbz","wf"};
  128. char (*arrayPoiner)[10];
  129. arrayPoiner = names;
  130. typedef char (*ArrayPointerType)[10];
  131. ArrayPointerType pointer = names;
  132. printf("%s\n",pointer[0]);
  133. }
  134. int main(int argc, const char * argv[]) {
  135. //
  136. // testBaseType();
  137. // testStruct();
  138. testTypedefBasicPointer();
  139. testTypedefStructPointer();
  140. testTypedefEnumPointer();
  141. testTypedefMethodPointer();
  142. testTypedefArrayPointer();
  143. return 0;
  144. }

ios学习之旅------玩转结构体的更多相关文章

  1. IOS 学习笔记 2015-03-24 OC-API-常用结构体

    一 标题 常用结构体 二 API 1 NSRange 表示一个范围 A 实例化 NSRange rg={3,5};//第一参数是起始位置第二个参数是长度 B 实例化 NSRange rg2=NSMak ...

  2. 【Swift学习】Swift编程之旅---类和结构体(十三)

    与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意:通常一个类 ...

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

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

  4. iOS Foundation框架简介 -1.常用结构体的用法和输出

    1.安装Xcode工具后会自带开发中常用的框架,存放的地址路径是: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.plat ...

  5. Go语言学习笔记(四)结构体struct & 接口Interface & 反射

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...

  6. Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...

  7. C语言学习总结(1)——结构体

      一,什么是结构体    我们知道数组(Array),它是一组具有相同类型的数据的集合.但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄 ...

  8. Bash脚本编程学习笔记07:循环结构体

    本篇中涉及到算术运算,使用了$[]这种我未在官方手册中见到的用法,但是确实可用的,在此前的博文<Bash脚本编程学习笔记03:算术运算>中我有说明不要使用,不过自己忘记了.大家还是尽量使用 ...

  9. Bash脚本编程学习笔记06:条件结构体

    简介 在bash脚本编程中,条件结构体使用if语句和case语句两种句式. if语句 单分支if语句 if TEST; then CMD fi TEST:条件判断,多数情况下可使用test命令来实现, ...

随机推荐

  1. NET下Assembly的加载过程

    NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后发现,并没 ...

  2. Python TurtleWorld configuration and simple test

    TurtleWorld provides a set of functions for drawing lines by steering turtles around the screen. You ...

  3. ASP.NET Identity 角色管理(Roles)

    当我们使用ASP.NET 4.5创建模板项目时,会发现模板只提供了ApplicationUserManager用于用户的登录注册.修改.设置等,而没有提供与用户角色相关的代码,对此就需要我们自己手动的 ...

  4. Android-Context的一切

    Context类型 我们知道,Android应用都是使用Java语言来编写的,那么大家可以思考一下,一个Android程序和一个Java程序,他们最大的区别在哪里?划分界限又是什么呢?其实简单点分析, ...

  5. 关于Mantle使用个人的一些见解

    前一个月,我接触到了Mantle,由于项目采用的是MVC的设计模式,选用好的model也是至关重要的.先介绍下Mantle的使用吧. 首先定义好数据模型: @property (nonatomic, ...

  6. CentOS6.9下sftp配置和scp用法

    基于 ssh 的 sftp 服务相比 ftp 有更好的安全性(非明文帐号密码传输)和方便的权限管理(限制用户的活动目录). 1.如果只想让某些用户只能使用 sftp 操作文件, 而不能通过ssh进行服 ...

  7. DELL T430进RAID的方式:, 硬盘损坏后的处理方式

    **DELL T430 新机安装2块硬盘后进RAID的方式: ** 一. BIOS更改 1.改启动方式为RAID mode  : 开机按F2进入BIOS 界面 --->System BIOS - ...

  8. 【http code】HTTP协议状态码详解(HTTP Status Code)

    参考资料: http://www.cnblogs.com/shanyou/archive/2012/05/06/2486134.html 1xx:请求收到,这些状态代码表示临时的响应. 2xx:操作成 ...

  9. Win10 +VS2015 配置openCV3.4.0

    配置过程参考链接:https://www.cnblogs.com/linshuhe/p/5764394.html 其他链接:https://blog.csdn.net/weixin_39393712/ ...

  10. UVALive 5790 Ball Stacking DP

    DP的方向真的很重要,这题做的时候死活想不出来,看了题解以后恍然大悟原来这么简单. 题意: 有n层堆成金字塔状的球,若你要选一个球,你必须把它上面那两个球取了,当然也可以一个不取.求选的球最大的权值和 ...