C语言指针与多维数组
指针与多维数组的关系 最近在复习C语言,学到C指针的时候,发现指针与多维数组间存在着一些很有意思的问题,这也是在我们使用指针时容易出现问题的地方。先从一个例子开始:
int zippo[4][2];
这个例子声明了一个4x2共8个int类型的二维数组。数组名zippo是该数组首元素的地址,所以zippo的值和&zippo[0]的值相同。而zippo[0]本身是一个内含两个整数的数组,所以zippo[0]的值和它首元素的地址(即&zippo[0][0]的值)相同。简而言之,zippo[0]是占用一个int大小对象的地址,而zippo是一个占用两个int大小对象的地址。由于这个整数和内含两个整数的数组都开始于同一个地址,所以zippo和&zippo[0]的值相同。
给指针或者是地址加1,其值会增加相同类型大小的数值。在这方面,zippo和zippo[0]不同,因为zippo指向的对象占两个int大小,而zippo[0]指向的对象占用一个int大小。因此,zippo+1和zippo[0]+1的值不同。
解引用一个指针(在 ...
C语言数据存储类别
C语言存储类别与变量存储类别相关的C语言关键字 关键字:auto extern static register _Thread_local
如何区别变量的存储类别 内存用于储存内存中的数据,数据的存储类别取决于它的存储期,作用域和链接。
存储期可以是静态的,自动的或动态分配的。如果是静态存储期,在程序开始执行时分配内存,并在程序运行时都存在。如果是自动存储期,在程序进入变量定义所在的块时分配内存,在离开块时释放内存。如果是动态分配存储期,在调用malloc()(或相关函数)时分配内存,在调用free()时释放内存。
作用域决定程序的那些部分可以访问某数据。定义在所有函数在之外的变量具有文件作用域,对位于该变量声明之后的所有函数可见,定义在块或作为函数形参内的变量具有块作用域,只对块以及它包含的嵌套块可见。
链接描述定义在程序某翻译单元中的变量可被链接的程度。具有块作用域的变量是局部变量,无链接。具有文件作用域的变量可以是内部链接或者是外部链接。内部链接意味着只有其定义所在的文件才能使用该变量,外部链接意味着其他文件也可以使用该变量 ...
C语言缓冲区
C语言缓冲区 在编写C语言的交互式程序时,在和程序进行交互的过程中,不知不觉地用使用到了缓冲区的概念。下面来了解一下C语言的缓冲区。
为什么要有缓冲区 首先,把若干字符作为一个块传输比逐个发送字符节省时间;其次,如果用户打错字符,可以直接通过键盘修改错误。当最后按下Enter键时,发送的才是正确的输入。
缓冲区的分类 C语言在不同的地方根据需要使用不同的缓冲区。缓冲区分为两类:完全缓冲I/O和行缓冲I/O。完全缓冲是指的是当前缓冲区被填满时才刷新缓冲区(内容被发送至目的地),通常出现在文件输入中。缓冲区的大小取决于系统,常见的大小是512字节和4096字节。行缓冲指的是在出现换行时刷新缓冲区。键盘输入通常是行缓冲输入,所以在按下Enter键时才刷新缓冲区。
C语言关键字和保留标识符
C语言关键字和保留标识符关键字 关键字是C语言的词汇。它们对于C语言比较特殊,不能用他们作为标识符(如,变量名)。许多关键字用于指定不同的类型。如int。还有一些(如if)语句用于控制程序中语句的执行顺序。下表列出了所有的C语言关键字,包括C11标准中出现的。
关键字
标准
描述
auto
K&R C
表明有意覆盖一个外部变量定义或者强调不要把该变量改为其他存储类别
extern
K&R C
显式声明一个定义与其他文件中的外部变量
short
K&R C
声明短整型数据
while
K&R C
程序循环
break
K&R C
跳出循环语句
float
K&R C
声明单精度的浮点数
signed
C90
声明带符号的数据类型
_Alignas
C11
用于指明内存对齐相关
_Alignof
C11
指明内存对齐相关
sizeof
K&R C
返回指向的数据对象或类型所占空间的大小,以字节(byte)为单位
for
K&R C
程序循环
case
K& ...
C语言中输入输出所有格式控制符
C语言中输入输出所有格式控制符 最近在重温C语言,发现C语言的输入输出函数scanf和printf函数在控制输入输出时有许多控制符来控制输入输出数据的格式。于是就打算来整理一下。
参考百度百科词条
scanf()是C语言中的一个输入函数。与printf函数一样,都被声明在头文件stdio.h里。它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。
printf命令的作用是格式化输出函数,一般用于向标准输出设备按规定格式输出信息。printf()函数的调用格式为:printf(”<格式化字符串>”, <参量表>)。printf()是C语言标准库函数,在 stdio.h 中定义。输出的字符串除了可以使用字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义。
函数定义 int printf(char *format…); int scanf(const char * restrict format,…);
函数返回值 printf 函数的返回值为printf实际控制 ...
使用免费CDN服务加速Github博客
最近发现部署在github上的个人博客网站访问加载的时间越来越久了,本身Github就已经很慢了,这个加载的速度令人难以接受,特别是对于有图片等比较大的文件需要加载的时候。于是开始考虑有没有什么方法能加速一下。
最好的方法当然是多花点钱,买个服务器把博客网站部署上去,不过哪有免费的东西用着舒服呢。于是发现了一个叫做CDN的加速方式,可以对资源访问进行加速。其实对于个人站点来说,只要能加速网站上的静态文件,比如图片、js文件、css文件,网站的访问速度就会大大的提升。
CDN加速的原理 CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。——百度百科
七牛云图床 七牛云就是一个这样的工具。可以把你需要加速的图片放到上面去。也提供免费的空间供你使用,不过需要注册和实名认证。感觉不是太友好。你也可以 ...
如何在代码中计算时钟周期数
如何在代码中计算代码执行的时钟周期数 有的时候,需要在代码中获取代码运行的时钟周期数。那么,怎么获取到某段代码在运行时的时钟周期数呢?
通过获取程序运行时间 在代码中直接计算一个程序的时钟周期是不容易的。但是计算一个程序的执行时间却是比较容易的。编程语言和操作系统都提供有相关的封装好的接口,可以很方便地调用来得到程序的运行时间。这方面的参考资料很多,我就不去介绍了。
如何获取程序的执行时间? Linux环境 || Windows环境
下面来介绍一下怎么通过获取的程序执行时间来得到十周周期数。 CPU时钟周期:通常为节拍脉冲或T周期,即主频的倒数,它是CPU中最小的时间单位,每个动作至少需要一个时钟周期。而主频又与与具体的时间有关。CPU的主频表示每秒进行的时钟周期数。那么运行时间与时钟周期数有如下的计算方式:
根据获取的运行时间和CPU的主频可以计算出程序的时钟周期数。
直接计算时钟周期数 也有直接计算时钟周期数的方法。为了给计时测量提供更高的准确度,很多处理器还包含一个运行在始终周期级别的计时器,它是一个特 ...
Huffman算法实现文件压缩解压
Huffman算法实现文件压缩解压前言 哈夫曼编码是一种贪心算法和二叉树结合的字符编码方式,具有广泛的应用背景,最直观的是文件压缩。下面讲述如何用哈夫曼编解码实现文件的压缩和解压。
哈夫曼编码的概念 哈夫曼树又称作最优树,是一种带权路径长度最短的树,而通过哈夫曼树构造出的编码方式称作哈夫曼编码。也就是说哈夫曼编码是一个通过哈夫曼树进行的一种编码,一般情况下,以字符 “0” 与 “1” 表示。编码的实现过程很简单,只要实现哈夫曼树,通过遍历哈夫曼树,这里我们从根节点开始向下遍历,如果下个节点是左孩子,则在字符串后面追加 “0”,如果为其右孩子,则在字符串后追加 “1”。结束条件为当前节点为叶子节点,得到的字符串就是叶子节点对应字符的编码。
哈夫曼编码用于文件压缩的原理 我们都知道根据人类使用文字对应的每个字符都是有特定的频率的。比如说英文,一般来说字母a或者e的使用频率很高。如果我们能给出现频率最高的字符很短的编码,出现最少的字符最长的编码,而且保证每个编码都不是任意一个编码的前缀码。为什么要保证这样呢?如果任意一个编码都不是其他编码的前缀码,那么只要读到一 ...
http/https代理服务器的代码实现
http/https代理服务器的代码实现代理服务器工作原理 代理服务器作为一种既是服务器又是客户机的中间程序,主要用于转发客户系统的网络访问请求。但是,代理服务器不只是简单地向真正的因特网服务器转发请求,它还可以控制用户的行为,对接收到的客户请求进行决策,并根据过滤规则对用户请求进行过滤。
通过代理服务器,网络管理员可以实现比用包过滤路由器更严格的安全策略。不同于使用通用的包过滤路由器来管理通过防火墙的因特网服务流向,代理服务器通过在网关上为每项需要的应用安装专用的代码(代理服务)来工作。如果网络管理员没有为某一特殊服务安装代理服务代码,该服务就不会被支持,也不会通过防火墙转发相应的客户请求。并且,这种代理服务器码能被配置成仅支持某项服务的网络管理员认为可以接受的那部分特征,而不支持其他的特征。
代理服务器主要功能 代理服务器具有许多功能。对于我们个人用户而言,通过代理上网,能让我们访问一些直接访问会比较慢的网站,比如互联网用户访问教育网的网站。对于单位而言,内部使用代理可以预先过滤一些病毒,保障上网的安全,还能有效地进行访问控制、网速限制,上 ...
通过修改注册表来更改IE代理
通过修改注册表来更改IE浏览器的代理设置一、什么是注册表 注册表是windows操作系统、硬件设备以及客户应用程序得以正常运行和保存设置的核心“数据库”,也可以说是一个非常巨大的树状分层结构的数据库系统。 注册表记录了用户安装在计算机上的软件和每个程序的相互关联信息,它包括了计算机的硬件配置,包括自动配置的即插即用的设备和已有的各种设备说明、状态属性以及各种状态信息和数据。利用一个功能强大的注册表数据库来统一集中地管理系统硬件设施、软件配置等信息,从而方便了管理,增强了系统的稳定性。
二、注册表的功能 注册表是windows操作系统中的一个核心数据库,其中存放着各种参数,直接控制着windows的启动、硬件驱动程序的装载以及一些windows应用程序的运行,从而在整个系统中起着核心作用。这些作用包括了软、硬件的相关配置和状态信息,比如注册表中保存有应用程序和资源管理器外壳的初始条件、首选项和卸载数据等,联网计算机的整个系统的设置和各种许可,文件扩展名与应用程序的关联,硬件部件的描述、状态和属性,性能记录和其他底层的系统状态信息,以及其他数据等。&ems ...