------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}; //只有定义的时候才能进行初始化;
struct Student
{
char *name;
int age;
};
struct Student stu ={“张三”,17,1.72};
struct Student
{
char *name;
int age;
} stu;
struct
{
char *name;
int age;
} stu;
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//访问stu2的birthday的month成员;
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 int、long:8个字节 %ld
2>short int、short:2个字节 %d %i
3>unsigned int、unsigned:4个字节 %zd
4>signed int、signed、int:4个字节 %d %i
b、float\double
1>float :4个字节 %f
2>double:8个字节 %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)
使用场合:当一个变量只允许有几个固定取值时