黑马程序员——09C语言其他数据类型学习

来源:互联网 发布:paxos一致性算法 编辑:程序博客网 时间:2024/05/17 01:09


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


一、变量类型 

根据变量作用域的不同,将变量分为局部变量和全局变量。

1、局部变量

a、定义:在函数(代码块)内部定义的变量;形参也属于局部变量。

b、作用域:从变量定义的那一行开始,一直到代码块结束;

c、生命周期:从变量定义的那一行开始分配存储空间,代码块结束后,就会被回收;

d、不初始化,内部值未知,没有固定的初始值。

2、全局变量

a、定义:在函数外部定义的变量; 

b、作用域:从变量定义的那一行开始,直到源程序结束(能被后面的所有函数共享)

c、生命周期:程序一启动就会分配存储空间,程序退出时才会被销毁;

d、默认的初始化值为0

二、结构体

属于构造类型

概念:可以由多个不同类型的数据构成;

和数组区别:数组只能由多个相同类型的数据构成;

1、定义:

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

a、定义结构体类型

格式:struct 结构体名{

                  类型名1  成员名1;

                  类型名2  成员名1;

                  类型名3  成员名1; 

                          ..........

                  类型名n  成员名n;

            }; // struct是关键字,是结构体类型的标志

b、根据结构体类型,定义结构体变量

实例:  #include <stdio.h>

int main()

{

//定义结构体类型Student

struct Student//内部的变量,可以称为是结构体的成员或属性

{

char *name;//8个字节

int age;//4个字节

double height;//8个字节

};

// 根据结构体类型Student,定义结构体变量stu

struct Student stu = { “张三”, 17, 1.72};

struct Student stu2;

stu2.name = ”李四”;

stu2.age = 19;

printf(“name=%s, age =%d, height=%.2f”, stu.name, stu.age, stu.height);

return 0;

}

错误写法:

struct Student stu3;

stu3={“王五”,18,1.66}; //只有定义的时候才能进行初始化

2、结构体的内存分析
a、定义结构体类型的时候,并不会分配存储空间;
b、定义结构体变量的时候,才真正的分配内存空间,且每个结构体变量分配的是单独的空间,各成员在内存中按定义的顺序依次排列;
c、如果结构体作为函数参数,只是将实参结构体所有成员的值对应的赋值给了形参结构体的所有成员,修改函数内部结构体的成员不会影响外面的实参结构体。例如;
     struct Student stu1 = {“张三171.72};
     struct Student stu2 = {“李四191.68};
     stu1 = stu2 //会将stu2所有成员的值对应的赋值给stu1的所有成员;
     stu2.name= ”王五”; //只改stu2name值,与stu1无关;
d、补齐(对齐)算法,结构体所占用的存储空间必须是最大成员的倍数。上面的结构体占用的空间是8+4+8=20,因为最大成员的字节数是8,所以占用的空间应该是24个字节。
3、结构体定义变量的三种方式:
a、先定义类型,再定义变量(分开定义)

struct Student

{

char *name;

int age;

};

struct Student stu ={“张三”,17,1.72};

b、定义类型的同时定义变量;

struct Student

{

char *name;

int age;

} stu;

这句代码做了两件事:定义结构体类型;利用新定义好的类型定义结构体变量。
同时可以定义新的变量: struct Student stu1;
c、定义类型的同时定义变量,省略类型名称;

struct

{

char *name;

int age;

} stu;

这种定义无法重复使用
4、结构体注意点:

a、结构体类型不能重复定义;

struct Student

{

char *name;

int age;

} stu;

struct Student

{

char *name;

int age;

} stu2;

这种写法是错误的,结构类型Student重复定义了;

b、结构体类型可以嵌套其他的结构体类型,但不可以嵌套自己;

struct Date

{

int year;

int month;

int day;

};

struct Student

{

char *name;

int age;

struct Date birthday;//这是可以的

struct Student stu;//这是错误的

} stu2;

stu2.birthday.month//访问stu2birthdaymonth成员;

5、结构体类型的作用域

a、从定义类型的那一行开始,一直到代码块结束。

b、结构体类型可以定义成全局变量,定义好全局变量,可以从这一行开始,一直到文件结尾都是有效的;在函数体内部再次定义该结构体也是可以的,不过这个函数用的不是全局变量的结构体,而是自己定义的结构体。即

(1)、定义在函数外面:全局有效;

(2)、定义在函数(代码块)内部:局部有效。

二、结构体数组

1、结构体数组的初始化:只能在定义结构体数组的同时进行初始化。

 struct RankRecord

    {

        int no; // 序号  4

        int score; // 积分 4

        char *name; // 名称 8

    };// 定义结构体类型

struct RankRecord records[3] =

    {

        {1,"jack"5000},

        

        {2,"jim"500},

        

        {3,"jake",300}

    };// 定义结构体数组

 records[0].no = 4;// 想要修改结构体内部元素值只能这么修改

    // 错误写法

    //records[0] = {4, "rose", 9000};

2、遍历结构体数组

for (int i =0; i<3; i++)

    {

        printf("%d\t%s\t%d\n", records[i].no, records[i].name, records[i].score);

    }

、指向结构体的指针

1、定义:struct 结构体类型 *p = &结构体变量名;

     struct Student {

     char *name;

     int age;

} stu = {“张三17};

struct Student *p;// 指针变量p将来指向struct Student 类型的数据

*p = &stu; //指针变量指向stu变量

2、访问结构体成员三种方法:

a、直接用变量名访问

printf(“name = %s,age=%d\n”, stu.name, stu.age);

b(*p).成员名称

printf(“name = %s,age=%d\n”, (*p).name, (*p).age);

c、p ->成员名称

printf(“name = %s,age=%d\n”, p->name, p->age);

、枚举

1、定义枚举类型

enum Season {

spring, //0

summer,  //1

autumn,  //2

winter  //3

};// 成员之间用','隔开

2、定义枚举变量

enum Season s = autumn;

printf(“%d”,s); //输出是2

3、使用场合:变量只有固定取值时,可以使用。

五、数据类型小结

1、基本数据类型

a、int

1>long intlong8个字节  %ld

2>short intshort2个字节 %d %i

3>unsigned intunsigned4个字节 %zd 

4>signed intsignedint4个字节 %d %i


b、float\double

1>float :4个字节 %f

2>double8个字节 %f


c、char

1>1个字节 %c %d

2>char类型保存在内存中的是它的ASCII值

 'A' -->65


2、构造类型

a、数组

1> 只能由同一种类型的数据组成

2> 定义:数据类型 数组名[元素个数];


b、结构体(struct)

1> 可以由不同类型的数据组成

2> 先定义类型,再利用类型定义变量


3、指针类型

a、变量的定义

int *p;

b、间接操作变量的值

int a =10;

p = &a;

*p = 20;


4、枚举类型(enum)

使用场合:当一个变量只允许有几个固定取值时


0 0
原创粉丝点击