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

黑马程序员-C学习日记-结构体

时间:2015-12-14 06:42:42      阅读:325      评论:0      收藏:0      [点我收藏+]

标签:

 

------- ios培训、 android培训、java培训、期待与您交流! ----------

一.局部变量与全局变量

1.局部变量:定义在函数内部的变量以及函数形参称为局部变量

作用域:从定义的那一行开始直到其所在的代码块结束

生命周期:从程序运行到定义那一行开始分配存储空间到程序离开该变量所在的作用域

特点:(1)相同作用域内不可以定义重名变量

        (2)不同作用域可以定义重名变量,内部作用域变量可以覆盖外部作用域变量

2.全局变量:函数外部定义的变量

声明: 数据类型 变量名称

定义: 数据类型 变量名称 

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

生命周期:从程序启动开始,直到程序退出

特点:(1)不可以重复定义,可以重复声明

        (2)局部变量可以与全局变量同名,在局部变量的作用域内,局部变量会覆盖全局变量

        (3)如果只有声明没有定义,系统自动定义并初始化为0

 

二.结构体基本概念

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

1)数组:多个同种类型的数据构成的一种类型

 特点:只能存放一种数据类型

2)结构体:用来存放某种特定含义的一组数据

 特点:对数据进行封装

2.结构体的定义

 (1)定义结构体类型

  struct 结构体类型名称{

    成员类型 成员名称;

        ……;

     }; // 此处须加分号

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

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

 

代码演示:

 1 #include <stdio.h>
 2 
 3 int main(int argc const char *argv[]){
 4 
 5 //定义一个人的结构体类型
 6 
 7     struct Person{
 8 
 9        int age;
10 
11        char sex;
12 
13        double height;
14 
15        double weight;
16 
17        char *name;
18 
19       };
20 
21 //定义结构体变量
22 
23    struct Person per;
24 
25 //访问结构体成员
26 
27    per.age = 10;
28 
29    per.sex = M;
30 
31    per.weight = 40.5;
32 
33    per.height = 1.2;
34 
35    per.name = "小明"36 
37   return 0;
38 
39 }

 

 

三.结构体初始化

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

  struct Person{

     int age;

     char *neme;

     double height;

    };

  struct Person p1;

  // 一一赋值

  p1.age = 10;

  p1.neme = "ww";

  p1.height = 1.55;

  // 整体赋值

  p1 = (struct Person){20,"小明"1.76};

ps: 整体赋值的时候,{}中的元素顺序与成员顺序相同

2.定义结构体变量同时初始化

  struct Person p2 = {15,"小红",1.55};

ps:同种结构体类型的结构体变量可以相互赋值

    p1 = p2;

 

四.结构体定义的多种方式

    1. 先定义结构体类型,再定义结构体变量(二.2有代码演示)
    2. 定义结构体类型的同时定义结构体变量

  struct Person1{

     int age;

     double height;

   };p1,p2 = {10,1.3};

   p1 = struct Person1 {13,1.5};

ps : 结构体类型定义不可以重名

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

   struct {

     int age;

     double height;

   };p1,p2 = {10,1.3};

   p1 = struct{13,1.5}; // 此处错误,这种定义方式不支持整体赋值

ps:这种定义方式,结构体类型不能重复使用

 

五.结构体作用域和内存分析

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

 在函数外边定义的结构体类型作用域如同全局变量

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

2.内存分析

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

(2)结构体类型本身不占用存储空间,就如果int不占用存储空间一样

(3)成员是相同数据类型的结构体所占用的存储空间是所有成员之和

(4)结构体内部有一个补齐算法,默认情况下它占用存储空间最大的成员倍数

 

六.结构体数组

1.结构体数组:数组元素为结构体的数组

 定义格式:

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

 // 定义结构体类型

  struct dog{

    char *name;

    int age;

   }

 //定义结构体数组  ps:如果没有初始化,元素都是垃圾值

  struct dog dogs[3];

2.结构体数组初始化

ps : 如果没有显式初始化的结构体数组,元素会被初始化为0;

 

代码演示:

 1 #include <stdio.h>
 2 
 3 struct dog{
 4 
 5     char *name;
 6 
 7     int age;
 8 
 9    }
10 
11 int main(int argc ,const char *argv[]){
12 
13    struct dog dogs[3];
14 
15   // 第一种方式:点定义然后初始化
16 
17    dogs[0]={"旺财",1};
18 
19    dogs[1].name = "小黑";
20 
21    dogs[1].age = 2;
22 
23  // 第二种方式:定义同时初始化
24 
25   struct dog dogs[3] = {{"旺财",1},{"小黑",2},{"大黄",3}};
26 
27 // 遍历结构体数组
28 
29 计算元素个数
30 
31 int count = sizeof(dogs)/sizeof(struct dog);
32 
33 for(int i=0;i<count;i++){
34 
35    printf("name=%s,age=%d\n",dogs[i].name,dogs[i].age);
36 
37  }
38 
39 return 0;
40 
41 }

 

 

七.结构体指针

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

定义格式:

所指向的结构体类型 *指针变量名称

 

   代码演示:

 1 #include <stdio.h>
 2 
 3 // 定义结构体类型
 4 
 5 struct Student{
 6 
 7    char *name;//姓名
 8 
 9    int age; //年龄
10 
11    int num;//学号
12 
13   }
14 
15 int main(int argc ,const char *argv[]){
16 
17 //定义结构体变量
18 
19 struct Student stu1 ={"李扬",25,001};
20 
21 // 定义结构体指针
22 
23 //struct Student *p;
24 
25 // 先定义然后初始化
26 
27 //  p =&stu1;
28 
29 // 定义同时初始化
30 
31 struct Student *p = &stu1;
32 
33 //访问成员的第一种方式
34 
35  (*p).num = 002
36 
37 //第二种方式
38 
39 p->name = "小红";
40 
41 p->age = 18;
42 
43 printf("name=%s,age=%d,num=%02d",stu.name,stu.age,stu.num);
44 
45 return 0;
46 
47 }

 

八.结构体嵌套

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

注意点:结构体不可以嵌套自己

        结构体可以嵌套自己类型的指针

//定义一个日期的结构体

struct Date{

   int year;

   int mouth;

   int day;

  }

//定义一个学生的结构体

struct Student{

   char *name;//姓名

   int age; //年龄

   int num;//学号

   struct Date inDate;// 入学时间

  }

 

九.结构体函数

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

 

代码演示:

 1 // 定义一个结构体
 2 
 3 #include <stdio.h>
 4 
 5    struct Person{
 6 
 7     char *name;
 8 
 9     int age;
10 
11 };
12 
13 //定义一个打印结构体Person的函数
14 
15 void printPerson(struct Person per)
16 
17 {
18 
19   printf("name=%s,age=%d",per.name,per.age);
20 
21 }
22 
23 int main(int argc ,const char *argv[]){
24 
25   struct Person p={"李扬"25}; 
26 
27   printPerson(p);
28 
29 return 0;
30 
31 }

 

2.注意点:

结构体作为函数参数传递是值传递

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

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

 

3.练习:写一个函数遍历结构体数组

#include <stdio.h>

//定义一个人的结构体

   struct Person{

    char *name;

    int age;

};

//定义一个遍历结构体数组的函数

void printPersons(struct Person *persons,int length)

{  

   for(int i=0;i<length;i++){

      printf("name=%s,age=%d",persons[i].name,persons[i].age);

    }

}

int main(int argc ,const char *argv[]){

  // 定义一个结构体数组

   struct Person p[3]={{"小明",10},{"小红",11}};

 // 计算结构体数组元素个数

   int len = sizeof(p)/sizeof(struct Person);

 // 调用函数

   printPersons(p,len);

  return 0;

}

 

十.枚举

1.枚举作用:消除魔法数字(表示特殊含义的数字)

2.使用场景:当某个东西只有几个取值的时候就用枚举

3.定义格式:

     enum 枚举类型名称{

         元素,//此处是逗号

         ……

       }

4.注意点:

(1)每一个元素都是标识符,代表一个常量,之后定义的变量不能与枚举元素重名

(2)给枚举变量赋值一定要使用枚举成员

(3)枚举一般与switch配套使用

 

 

 

黑马程序员-C学习日记-结构体

标签:

原文地址:http://www.cnblogs.com/ly0709/p/5044010.html

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