------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一、基本数据类型
1.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
2.float\double
1> float :4个字节 %f
2> double:8个字节 %f
3.char
1> 1个字节 %c %d
2> char类型保存在内存中的是它的ASCII值'A' --> 65
二、根据变量的作用域,可以分为:
1.局部变量:
1> 定义:在函数(代码块)内部定义的变量(包括函数的形参)
2> 作用域:从定义变量的那一行开始,一直到代码块结束
3> 生命周期:从定义变量的那一行开始分配存储空间,代码块结束后,就会被回收
4> 没有固定的初始值
2.全局变量
1> 定义:在函数外面定义的变量
2> 作用域:从定义变量的那一行开始,一直到文件结尾(能被后面的所有函数共享)
3> 生命周期:程序一启动就会分配存储空间,程序退出时才会被销毁
4> 默认的初始值就是0
二、构造类型
1.数组
1> 只能由同一种类型的数据组成
2> 定义:数据类型 数组名[元素个数];
2.结构体
1> 可以由不同类型的数据组成
2> 先定义结构体类型(例如struct Person),再利用类型定义变量名
注意:数组和数据结构都只能在定义的时候赋初值,否则会报错。例如:struct Person P2; P2={1,1,1};是错的,数组类似intages[3];ages={1,1,1}。也是错的。
数据结构其实跟数组很相似,在赋值的时候可以不按顺序赋值,例如对结构体不按顺序赋初值struct Person P={.name=”rose”,.heigh=1.65,.ages=20};
3>结构体内存:
结构体在定义类型的时候并没有分配内存,因为还没定义结构体变量。
例如:struct Person{ int ages,double heiht,char *name};
Struct Person P={25,1.5,”joy”};(为变量P分配内存空间,且空间的大小为里面元素的数据类型和);
结构体在分配内存空间的时候有一个补齐(或对齐)算法。也就是内存空间的大小一定是结构体内最大成员字节数的倍数。计算机采用这种算法主要是提高运算速度
4>结构体数组:
例题:
<span style="font-size:18px;">int main()
{
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};
for (int i = 0; i<3; i++)
{
printf("%d\t%s\t%d\n", records[i].no, records[i].name,records[i].score);
}
//printf("%d\n",sizeof(records));
return 0;
}</span>
5>指针指向结构体的内存方式如下图:
利用指针调用结构体的属性有以下三种方法:
struct Student
{
int no;
int age;
};
// 结构体变量
struct Student stu = {1, 20};
// 指针变量p将来指向struct Student类型的数据
struct Student *p;
// 指针变量p指向了stu变量
p = &stu;
p->age = 30;
// 第一种方式
printf("age=%d, no=%d\n",stu.age, stu.no);
// 第二种方式
printf("age=%d, no=%d\n",(*p).age, (*p).no);
// 第三种方式
printf("age=%d, no=%d\n",p->age, p->no);
总结:结构体就像面向对象一样,它是不同基本数据类型的集合,数据结构用途广泛,必须理解掌握。