黑马程序员—C语言—其他数据类型及小结
2014-11-03 11:29
351 查看
------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 = {“张三”,17,1.72};
struct Student stu2
= {“李四”,19,1.68};
stu1 = stu2 //会将stu2所有成员的值对应的赋值给stu1的所有成员;
stu2.name= ”王五”; //只改stu2的name值,与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//访问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);
}
= &结构体变量名;
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);
enum Season {
spring, //0
summer, //1
autumn, //2
winter //3
};// 成员之间用','隔开
2、定义枚举变量
enum Season s = autumn;
printf(“%d”,s); //输出是2;
3、使用场合:变量只有固定取值时,可以使用。
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)
使用场合:当一个变量只允许有几个固定取值时
一、变量类型
根据变量作用域的不同,将变量分为局部变量和全局变量。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 = {“张三”,17,1.72};
struct Student stu2
= {“李四”,19,1.68};
stu1 = stu2 //会将stu2所有成员的值对应的赋值给stu1的所有成员;
stu2.name= ”王五”; //只改stu2的name值,与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//访问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)
使用场合:当一个变量只允许有几个固定取值时
相关文章推荐
- 黑马程序员——C语言小结------其他数据类型
- 黑马程序员——C语言——数据类型的一些补充与小结
- 黑马程序员-IOS学习笔记-C语言基础其他数据类型及总结
- 黑马程序员——C语言中指针与其他数据类型的结合使用
- 黑马程序员——C语言小结------宏定义以及基本数据类型总结
- 黑马程序员————C语言基本语法(数组、字符串、指针、其他数据类型)
- 黑马程序员---C语言数据类型总结
- 黑马程序员_c语言的复杂数据类型
- 黑马程序员——09C语言其他数据类型学习
- 黑马程序员——c语言复杂数据类型:结构体和枚举,typedef的使用
- 黑马程序员 -- C语言 指针 其他类型
- 黑马程序员—C语言_基本数据类型
- C语言中关于指针的数据类型和指针运算的小结
- 【黑马程序员】iOS学习之路——C语言之数据类型、常量、变量
- 【黑马程序员】---C语言数据类型总结02
- 黑马程序员——c语言的复杂数据类型:数组和指针
- 黑马程序员_C语言_数据类型总结
- 黑马程序员-c语言学习之数据类型的整理
- C语言--C语言种输入其他类型数据后输入字符数据时跳过问题处理
- 黑马程序员——C语言------关键字、标识符、注释、数据类型