目录
一.解引用操作符(*)、取地址操作符(&)(复习)
1.例析
#include<stdio.h>
int main()
{
int a = 20;
int* p = &a;
*p = 10;
printf("%p\n", p);
printf("%p\n", &a);
printf("%d\n", *p);
printf("%d\n", a);
return 0;
}
输出结果:
分析:
- int* p:p是指针变量,定义指针变量需要在相关的数据类型后面加上*,此处的*并非是解引用操作符,仅仅是一种格式,并无实际意义,int则是指针变量p所指对象的数据类型,因为前面定义的a是int类型,所以该处是int*(整型),在其他场景下可以是double*(双精度型)、char*(字符类型)、float*(单精度型),按照具体情况而定
- &a:&为取地址操作符,&a则是取出a的地址
- int* p=&a;:这一步是取出a的地址(对应&a),并赋给指针变量p,如果此时打印指针变量p那么输出的结果就是a的地址(即第7、8行代码,输出结果第1、2行),如果要打印a的地址要么printf("%p\n", p);要么printf("%p\n", &a);但要注意一个有&一个没有&,p前面没有&是因为指针变量p指代的就是&a
- *p=10;:此处的*是解引用操作符,目的是间接访问p的地址即a,并将a的大小改成10,再强调一下此处的*与int*中的“*”的意义不同,前者是解引用操作符,后者是一种语法形式,无实际意义
二.结构体(struct)
1.什么是结构体
在前面我们了解了整型(int)、浮点型(float、double)、字符型(char),但这些仅能表示数字和字符,如果我们要表示一个人、一本书呢?一个人由姓名、年龄、性别、工作……组成,单单依靠int这些数据类型是无法表示的,因此我们引入了结构体这一数据类型用来表示复杂的事物
2.例析
#include<stdio.h>
struct people
{
char name[20];
int age;
char work[20];
double time;
};
int main()
{
struct people p1={"张三",2022,"法外狂徒",2022.827};
printf("姓名:%s\n",p1.name);
printf("年龄:%d\n",p1.age);
printf("工作:%s\n",p1.work);
printf("作案积累时长:%f\n",p1.time);
return 0;
}
输出结果:
3.详解
(1)语法
#include<stdio.h>
struct 复杂对象(例中为people)
{
数据类型(例中为int、char……) 对象信息1(例中为name、age……);
数据类型 对象信息2;
……
};(千万要记得加上“;”这是固定语法)
int main()
{
struct 复杂对象 结构体变量1(例中为p1,这是利用结构体类型来创建一个该类型的结构体变量)={输入对象的具体信息,与上面的顺序一一对应};
printf(" ",结构体变量1.对象信息1);
printf(" ",结构体变量1.对象信息2);
……
return 0;
}
(2)分析
这一步我们仅仅是创建好了一个“外壳”,有点类似于下载软件前需要配置环境,也可以理解为创建了一个新的类型结构,之后我们需要描述一个人时便可以借用这个“外壳”
struct people p1={"张三",2022,"法外狂徒",2022.827};便是创建了一个结构体变量p1,也就是我们创建的第一个“人”,在{ }内按照前面struct中我们定义的一些变量(如name,age……)对应填写相关信息。
之后便是使用printf进行打印,一般使用printf打印是这样的:printf("a的值:%d\n",a);,而在结构体中是需要用到一个操作符:“.”该操作符是用来找到people当中对应的变量(age、name……),因为p1中有很多成员:name、age……而我们只需要打印name,那么我们只需要在p1后加上.name就行了:printf("姓名:%s\n",p1.name);这样我们就可以打印出name对应的信息了,即张三。
4.补充:float和double之间的区别
- float是单精度类型,double是双精度类型。说人话就是double比float精度更高。(float的精度是6位小数,double是15位小数)
- float储存大小是4个字节,double是8个字节。
- 第一点说到的精度是他们的最大保留位数,你可以人为指定保留到第几位,但不能超过这个范围,超过的地方便会取近似值。
- 如果没有人为规定取几位小数,系统会默认保留6位小数。也就是说即使你使用的是double,最后也会和float一样,是一个6位小数(见图1、图2)
- 但一般情况不人为指定时,就会取可靠保留,可靠保留的位数比最大保留位数要小,例如float的最大保留是6,而可靠保留则是小于6(见图1中只有小数点后四位相同,后面的都是近似值,但不一定是保留4位,而是从该数字第一个数开始到第八个数结束,这八个数是精确保留,后面的则是取近似值)(见图3,图4),因为double的最大保留较大,所以可靠保留也较大,使用double时小数点后6位都可以准确保留
最后:
作者不善言辞,很多地方表达不是很准确,希望大家指正!如果有不理解的地方可以私信,我会一一答复。
如果文字我解释的不是很清楚,大家可以结合图片和例析^_^
看完后记得自己动手敲一敲^_^