C语言声明
C语言的声明可以嵌套,所以可以构成一些相当复杂的嵌套,这种过于复杂的声明并不推荐,但是我们应该学会如何去阅读这些声明。并在后面的部分会讲述如何利用typedef去简化这些声明
left-right rule
"left-right" rule是解读C语言声明的强力规则,掌握这个规则足够让我们解决几乎所有的C声明,而且规则并不复杂,分为下面几步
从变量名开始阅读
从包含变量名的最内部的括号由内而外解释,对于每个括号的内部,先往右边解释,再往左边解释,层层解释> 直至结束。
第一条规则告诉你如何开始,第二条规则告诉你如何解释,然后,我们要记住一些规则,你可以理解为这是规定的内容,是死的。
* 读作 “指向…的指针” ,接下里的标识符修饰指针指向的内容
[] 读作 “…的数组” ,接下来的标识符修饰数组的元素
() 读作 “返回…的函数”,接下来的标识符修饰函数返回值
读作...是用语言的方式去将声明一层层定义出来,就是反映了接下来修饰的内容,理解后面的部分我认为会更加直接。
好的,看了上面的内容你大概了还是相当模糊的,不要急,上面的内容暂时不 ...
C语言的数据存储
C语言允许类型之间进行转换,包括隐式的转换和强制转换,为了我们能更好的理解这些特性,我们需要了解C语言的数据在计算机中到底是如何存储的。
整型数据
我们先从简单的整型数据开始。
无符号整数的储存比较简单,直接以二进制形式储存,64位机的signed int存储形式如下
而有符号整数的表示稍复杂,有符号整数的最高位是符号位,0代表整数,1代表负数。
在计算机中,有符号整数以补码的形式储存。关于补码,我们只需要理解它的设计的目的是为了简化有符号整数的计算,通过自然溢出实现正确的运算的结果。
可以简单的记忆如下:
(x)补码+(−x)补码=0(x)补码+(−x)补码=2w(w是存储的位数)−x的补码可以用2w−x计算得出(−x)补码=2w−(x)补码(x)_{补码}+(-x)_{补码}=0 \\
(x)_{补码}+(-x)_{补码}=2^w(w是存储的位数) \\
-x的补码可以用2^w-x计算得出 \\
(-x)_{补码}=2^w-(x)_{补码}
(x)补码+(−x)补码=0(x)补码+(−x)补码=2w(w是存储的位数)−x的补码可以用2w−x计算得出(−x)补码=2w ...
C语言的弱类型性
C语言是一个强类型的语言,变量必须先定义再使用,而且变量如果不经过转换,那么将永远保持原来的类型。但强和弱是相对的,如果我们把C语言和其它的一些强类型语言相比较,我们会发现C语言的一些弱类型特性,这些特性会在某些时候坑害我们。当然,讨论强类型还是弱类型是没有意义的事情,重要的是从这些对比中学到一些东西,避免因此而犯下错误。
隐式类型转换——梦开始的地方
众所周知,对两个类型不同类型的数据操作时,如果这两个数据在一定的兼容范围内,C语言会对其中一个数据进行隐式的类型转换,优先级如下。
我们拿经典的JAVA语言举例,JAVA禁止了boolean与整型数据之间的类型转换,也禁止了整型与浮点型数据的转换,为语言提供了更高的安全性。如此丰富的类型转换,反映了C语言的"弱类型"特性,一方面是C语言为我们的编程提供了更高的自由度,另一方面也增大了隐患。
来看一个简单的例子。
1234567int a = -1;unsigned int b = 1;if(a > b) { printf("a > b");} else & ...
GDB快速入门
GDB全称GNU symbolic debugger,诞生于GNU计划,是一款程序调试器,如果脱离IDE环境,GDB将会是你强大的帮手。
GDB下载和使用
在windows环境中只要下载过C语言应该就会有GDB,这里主要介绍linux环境,也很简单
12345# centos$ sudo yum install gdb# ubuntu$ sudo apt install gdb# 其它系统类似
调试一个程序,例如我们现在要调试可执行程序a.out
1$ gdb a.out
此外,如果我们要调试一个C语言的程序,我们需要在gcc编译时增加-g选项,这个选项告诉编译器添加调试信息
1$ gcc -g main.c
GDB调试常用命令
下面是一些常用的命令,括号里面是命令的缩写,使用两者都可以
run(r)
启动程序,如果有断点则运行至第一断点,如果没有则运行到结束
next(n)
让程序往下执行一步
list(l)
列出程序源代码及其行号
break(b)
给程序打断点,可以给某一行打断点,也可以给一个函数打断点
12$ b 行号$ b 函数名
info(i)
查看调试信息, ...
指针和数组并不相同——C语言
在我们初学C语言时,我们会有这样一个认知或者感觉:指针和数组是相同的。我们也经常干着这样的事情,比如下面这样代码。
123456789int main() { int a[3] = {1, 2, 3}; int *p = a; printf("%d\n", p[0]); printf("%d",*(a+1)); return 0;}
这样看起来两者似乎确实没有差别,指针可以像数组一样使用[],而数组名也可以解引用,而且它们的结果是一致的。
或者在我们定义函数时,也可能会把两者当成一种处理。
1234567891011void foo(int *p) { printf("foo: %d", p[1]);}int main() { int a[3] = {1, 2, 3}; foo(a); return 0;}
一切看起来都是那么自然。
首先我们要肯定,两者之前确实有相似 ...
Dosbox和masm搭建汇编环境
学习汇编语言之前,需要有一个环境来运行汇编代码,所以此文记录下自己的环境搭建过程
下载Dosbox和masm
Dosbox提供32位机环境,masm负责编译汇编代码
Doxbox下载地址
Dos官网
点击Download下载即可
接下来安装masm
https://github.com/xDarkLemon/DOSBox_MASM/tree/master
下载解压以后我们只需要这个masm文件夹
配置Dosbox
接下来我们需要把masm配置到Dosbox中,我们打开DOSBox 0.74-3 Options.bat文件
在文件的底部加入如下内容,把D:\1Packages\Debug换成你自己masm文件夹所在位置,此外我们在相同目录下可以新建一个asm目录作为工作目录
1234MOUNT F D:\1Packages\Debugset PATH=%PATH%;F:\masm;F:cd F:\ASM
意思是把本机的D:\1Packages\Debug目录挂载到Dosbox的F盘,这样我们就可以在Dosbox下的F盘直接使用masm命令了
这样就配置完成了,如果觉得窗口太小 ...
(二)docker的基本使用
在第一节的内容中,我们了解了docker的作用,以及完成了docker的安装和docker的hello world,初步进入了docker的时间,这一节内容会从docker的基本架构出发,讲解组成架构中组成部分的关系以及如何操作它们。
Docker的架构
接下来我会讲解docker的基本使用方式,在学习之前,我们先来看看docker的整体架构。
我们来看看docker的组成部分,首先docker是有一个客户端的,是一个C/S架构。
然后我们来看看docker最核心的部分——容器,镜像,仓库。我们之前说了docker把软件和环境打包到一起,那么这个打包的结果就是一个镜像,这个镜像是一个模板,如果我们要运行这个应用,docker会按照这个模板,生成一个容器去运行这个应用。
与创建一个虚拟机相对比,镜像就类似于iso文件,而容器就类似于虚拟机,镜像只是充当了一个不变的模板,而根据这个模板,我们可以运行任意数量的“容器”。
那么仓库这个概念也就好理解了,仓库就是用于存放镜像的,我们可以从仓库去下载我们需要的镜像,那么接下来我们就先从容器,镜像这两个方面来讲述docker的操作。
镜像的 ...
(一)开启docker的旅程
天下苦环境久矣
printf("Hello World!"),这也许是你学习C语言时打印的第一行语句,C语言作为大多数人的入门语言,Hello World开始了我们的代码生涯。对于过去初学的我们而言,要打印出这一行代码并不轻松,我们要安装一个集成开发环境,可能是CodeBlocks,可能是visual studio等等,有些可能会给我们安装好C语言的环境,有些则要自己安装或者是配置环境变量。可能我们千辛万苦安装好了运行环境,结果要运行一个项目,我们可能还需要下载这个项目所需要的依赖。不管具体的情况如何,配置环境,这短短的四个字可能将会在接下来的几年时间里一直折磨我们。
环境给我们带来了很大的痛苦,但我们显然不会就此认命,有了疼点,就会有相应的解决方案,我们手里可是握着代码的程序员。那么到底应该如何解决这个问题呢。在起初,我们首先解决的是依赖问题,对于各种语言,都有了自己对应的包(依赖)管理机制,例如Java的Maven,javascript的npm等,这些包管理工具记录了我们项目所需要的依赖,借助于这些工具,我们在下次运行这些程序时可以快速下载好所需要的依赖。依赖 ...
mysql索引使用指南
mysql索引概述
在我们正式开始讲索引之前,我们不妨回想一个场景,当我们使用字典的时候,我们并不会直接去整本书去检索内容,而是先去查找目录,根据目录给我们提供的页码,在从字典中查询信息,索引就类似于字典中的目录,可以大大提高数据检索的效率。
mysql的索引机制是mysql提供给我们的一个超强的功能,正确的索引可以大大提高mysql检索的速度和效率。
索引本质
如果了解过数据结构或者数据库的底层,那么一定知道mysql索引的底层是基于B+树的,那就是说所谓索引其实就是B+树,对某一个字段建立索引就是以这个字段为关键字建立B+树,这棵B+树会被保存在mysql的文件中,具体的文件会根据引擎的不同而不同,以最常用的innodb和myiasm为例:
myisam:
tablename_myisam_index.frm:该文件中存储表的结构信息。
tablename_myisam_index.MYD:该文件中存储表的行数据。
tablename_myisam_index.MYI:该文件中存储表的索引数据。
innodb:
tablename_innodb_index.frm:该文件 ...
nginx基本使用指南
nginx是什么
nginx是一个由C语言编写的轻量级web服务器,占用内存小,并发能力强,性能非常优越,是当下非常流行的web服务器。除此以外,nginx还支持相当多的功能,包括但不限于
反向代理
负载均衡
动静分离
这些也是nginx常见的应用场景,今天我们就来全面的介绍一下nginx的应用
环境准备
操作系统采用centos7
nginx的安装相当简单,在centos中我们可以直接用yum安装
1$ yum install nginx
在安装的众多文件中,有两个文件是要注意的
/etc/nginx:存放nginx的配置文件
/usr/share/nginx/html:nginx默认的web根
接下来启动nginx试试
123$ systemctl start nginx# 再来测试看看,能正确返回内容即可$ curl localhost
在浏览器中访问服务器ip,出现下图页面即成功
这里列出一下常用命令
12345678910111213nginx -s reload # 向主进程发送信号,重新加载配置文件,热重启nginx -s reopen # 重启 Ng ...