以 int 为元素的数组自动转换为指向int的指针
以 double 为元素的数组自动转换为指向double的指针
以指针为元素的数组自动转换为指向指针的指针
以数组为元素的数组自动转换为指向数组的指针
int是一个形容词,修饰了(*A)【200】
意思是(*A)【200】是一个int
解得*A是一个长度为200的数组
解得A是一个指向数组的指针
static变量:作用域(从哪里到哪里能用)和局部变量(只能在那个定义的花括号里面用)一样
存续期(从哪里出生到哪里消失)和全局变量一样(从定义时出生在程序结束时消失)
虽然static可以开在局部里,但是它不在栈区里面
函数声明:告诉编译器有这个函数和这个函数怎么用,但是没告诉编译器这个函数干什么。
前面写:函数返回类型 函数名(参数类型,名称);
中间int main()里调用
后面写:函数返回类型 函数名(参数类型,名称){函数内容}
代码也有地址
定义函数double f(char c)
如何取地址??double (*p)(char)
如何用地址调用函数??(*p)(“A”,true)
函数会在运行时自动转换为指针。
void指针:单纯的只指向内存里的某一个地方(单纯记一下地址),不知道这玩意是什么类型,根本不知道它是什么
硬盘和无线网卡都是输出兼输入
运行内存和硬盘的区别:
运行内存优缺点:
优点:速度快
缺点:内存小,断电就没了。
硬盘优缺点:
优点:内存大,断电还存着
缺点:速度慢
程序运行时,机器语言代码会被复制到运行内存中
编译器自己本身在程序软件里
程序软件在硬盘里,所以编译器自己也在硬盘里,编译器自己也是由机器语言写成的,运行时它也会被放进运行内存里边然后把要运行的c++语言翻译然后再转由CPU运行
cPU本身是一个硬件(看得见摸得着),但是它运行的机器语言就相当与一个文章(看得见摸不着)。
显卡(用于输出视频信号)在上图的下图拐角右边和箭头左边的位置。
主板(连接各个硬件)是上图的所有的东西在一起
显卡:
GPU:相当于显卡里的小CPU,用于处理画面
显存:相当于显卡里的小运行内存,用于储存GPU处理出来的画面
视频控制器:用于把视频信号传至显示器
刷新率:一秒钟画面输出多少次,视频控制器在显卡里面一秒钟读多少次显存里面的画面。
帧率:一秒钟GPU写几次新的画面
画面撕裂:当显示器按照刷新率更新到一半时,GPU刚好也把画面更新了一次,然后就会出现上一半是上一个图片,下一半是下一个图片的显示器(显示器是按照画面这个二维数组来一次从左到右,从上到下输出的。)
垂直同步:在GPU处理一些对他而言非常简单的图时
会发生垂直同步,所谓垂直同步就是你GPU很快地算完了这张图,等到视频控制器更新完显示器上的图才开始处理下一张图。但是要是GPU从上一次处理完到下一次开始处理的时间不够它取处理的话,还是会发生画面撕裂。
双重缓冲:在显存里面存2个二维数组,而视频控制器输出的时候用指针指向其中一个数组,GPU更新完之后再把指针转到另一个数组上,但是同垂直同步,还是不可以完全杜绝画面撕裂。
垂直同步+双重缓冲:这样才能强强联手完全杜绝画面撕裂,也是在显存里面存2个二维数组,但是也是在等到视频控制器更新完显示器上的图才把指针转到刚更新完的图片二维数组上。但是会有延迟,因为它的副缓冲区更新了一次到下一次更新完就不更新了,所以会有延迟。
三重缓冲+垂直同步:在显存里面3个二维数组,在整个过程中都在用余下的两个二维数组轮流更新,也是在视频控制器更新一张图片结束的时候把指针拐到最新的那个二维数组上,这样可以同时杜绝画面撕裂与延迟。
标红的字都是GPU等视频控制器(屏慢卡快)
下面则是视频控制器等GPU(屏快卡慢)
GSync/FreeSync:
相当于GPU处理得不如视频控制器快,然后视频控制器就会等GPU处理完才开始播放下一个图片。