C指针原理揭秘:基于底层实现机制(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-02 05:30:59

点击下载

作者:刘兴

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

C指针原理揭秘:基于底层实现机制

C指针原理揭秘:基于底层实现机制试读:

前言

为什么要写这本书

C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔实验室的D.M.Ritchie于1972年推出。1978年后,C语言已先后被移植到大、中、小及微型机上。它可以作为工作系统设计语言,编写系统应用程序;也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,适用于系统软件开发及嵌入式开发领域,具备很强的数据处理能力,不仅仅是在软件开发上,在各类科研中也都需要用到C语言。

指针是C语言中广泛使用的一种数据类型,是C语言中功能强大而又让人迷惑的亮点,运用指针编程是C语言最主要的风格之一。作为一把双刃剑,C指针让C语言成了能编写操作系统的接近硬件层的语言,能让编程者实现很多其他语言实现不了的功能;但是有时编程者也会感到无所适从,因为稍有不慎,就将造成内存泄漏、指针越界、指针类型错误等异常情况。而汇编中间码揭示了内存如何分配和使用、翻译形成的底层语言如何工作等,通过分析汇编中间码,揭开隐藏在C语言背后的秘密,剖析“C指针作为内存里的一个地址”这一事实。

C指针本质及其实现机制非常重要,为了让编程者更好地掌握这把“双刃剑”,本书从指针基础讲解入手,由浅入深,最后分析了汇编及底层语言,全面剖析了C指针。

读者对象

·程序员。C/C++程序员能在充分理解C指针以及指针实现机制的基础上,开发软件系统的中间件、核心库,评估内存占用、运行效率、突发异常、程序后门等情况,提高软件质量,增加可移植性,进行编译优化;而对占用CPU时间较多的代码可用汇编语言代替,提高软件运行速度。在受限环境(嵌入开发、并行计算、冗余系统等)下,正确使用C指针以及评估软件运行质量,能促使编写的代码更稳定、更安全、更高效。脚本语言程序员也能从C指针中收获很多,Python、Perl等脚本语言都能与C/C++混合编程。

·架构师。指针是C/C++语言的基石,任何复杂的算法和大型甚至云计算软件系统都是基于这些基石构造的,只有掌握好系统的底层,才能提高系统整体运行效率。架构师在理解C/C++指针以及实现机制的基础上,能根据软件运行环境定制适合软件需求的架构,每种软件架构在内存分配、程序运行等方面都有自己的使用策略。目前,随着大数据时代的来临,云计算平台发展很快,C/C++语言编程质量的改进能提高云计算中单机的运行效率和稳定性,能优化数据在云计算网络的传输效率。

·算法工程师。近年来,随着国内计算机行业的发展,数据挖掘、机器学习、算法工程、云计算、编译工程、芯片工程等新生事物相继出现,这些以前仅在高校和科研院所研究的技术需要算法工程师的努力才能成为现实,而掌握诸如指针等编程知识是实现算法的基础。

如何阅读本书

全书分为准备篇、基础篇、进阶篇。指针及相关内容是编程语言中较难理解的部分,脚本语言稍好些,C/C++语言中会更加明显。虽然理解指针本身并不复杂,但指针之间的组合以及指针的灵活运用却存在不同的技巧,不同的组合能产生不同的效果,也有着不同的作用。本书力求从底层实现机制进行解析,同时配合C/C++编程技巧以及某些指针运用技巧,讲解如何提高程序效能,如何避免滥用指针。

本书首先从在C语言编程的角度讲解C指针,力图使读者学会运用C指针进行开发,并能进一步灵活将指针运用在精巧的算法上,构造更复杂的软件系统。

接着,对C语言标准进行讲述。C语言属于高级语言,广泛采用的有C89和C99这两个主要标准。C89于1989年以ANSI X3.159—1989“Programming Language C”名称发布生效,这个版本的语言经常被称作ANSI C,或C89;C99在C89的基础上新增了一些特性,作为C语言官方标准的第2版,于1999年以ISO/IEC 9899:1999“Programming Language-C”名称发布生效,并于2000年3月被ANSI采纳。

最后,对编译器的实现原理进行解读。编译器对C语言进行编译,编译后形成可执行文件,针对C/C++语言以编译的形式执行(TCC等提供了一种解释执行C脚本的方式,但其原理和编译执行差不多)的情况,重点从编译器生成的汇编中间码对指针进行剖析。

勘误和支持

由于作者的水平有限,编写的时间也很仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。你在遇到任何问题或有更多的宝贵意见时,欢迎发送邮件至我的邮箱liu.xing.8@foxmail.com,很期待能够听到你的真挚反馈。此外,本书的代码及相关资源请在网盘(网盘地址:https://dwz.cn/uo3gCxWK,提取码:457a)下载,本书读者QQ群为834755376。

致谢

在此,我衷心感谢机械工业出版社华章公司编辑杨福川老师和策划编辑杨绣国老师,由于他们的魄力和远见,让我顺利地完成了全部书稿。

谨以此书献给热爱C语言的朋友。刘兴中国,湖南第一篇 准备篇我仍然爱着C语言。如此简单,如此强大。——Java之父 詹姆斯·高斯林(James Gosling)第1章C语言概述

C语言是一种通用的、过程式的编程语言,其广泛应用于系统与应用软件的开发,具有高效、灵活、功能丰富、表达力强和可移植性强等特点,是最近20多年使用最为广泛的编程语言。C语言是由美国的丹尼斯·里奇(Dennis M.Ritchie)于1969年至1973年以B语言为基础在贝尔实验室开发完成的。

1978年之后,C语言先后被移植到各种大、中、小型机及微型机上,它既可以作为工作系统设计语言编写系统应用程序,也可以作为应用程序设计语言编写不依赖计算机硬件的应用程序。目前,C语言的编译器支持各种不同的操作系统,如UNIX、Windows、Linux等。C语言的设计也在很大程度上影响了后来的编程语言,例如C++、Objective-C、Java、C#等。1.1 C语言的起源与发展

C语言的发展历史颇为有趣,它的原型是ALGOL 60。1963年,剑桥大学将ALGOL 60发展成为CPL(Combined Programming Language);1967年,剑桥大学的Matin Richards对CPL进行了简化,于是产生了BCPL;1970年,美国贝尔实验室的Ken Thompson对BCPL进行了修改,改名为B语言,同时用B语言编写了第一个UNIX操作系统;1973年,美国贝尔实验室的丹尼斯·里奇在B语言的基础上最终设计出了一种新的语言,他选取BCPL的第二个字母作为这种语言的名字,即C语言,丹尼斯·里奇因此被世人称为“C语言之父”。

为了推广UNIX操作系统,1977年,丹尼斯·里奇发表了《可移植的C语言编译程序》,1978年,布莱恩·克尼汉(Brian W.Kernighian)和丹尼斯·里奇出版了名著《The C Programming Language》,使C语言迅速成为世界上流行最广的高级程序设计语言,K&R C也因此确定了其事实性标准的历史地位。

随着微型计算机的日益普及,不同种C语言之间出现了不一致的问题,这一点为C语言的广泛应用带来了不便。1989年,美国国家标准局(ANSI)颁布了第一个官方的C语言标准(X3.159-1989),简称ANSI C或C89;1990年,C89被国际标准化组织(ISO)采用为国际标准(ISO/IEC9899:1990),简称为C90,这是目前广泛使用并完全支持的标准。

1999年,国际标准组织为C语言发布了新的标准ISO/IEC 9899:1999,修正了C89标准中的一些细节,并增加了更多更广的国际字符集支持,这个标准通常被称为C99,ANSI于2000年3月采用C99。

2011年12月8日,ISO正式发布了C语言的新标准C11,之前被称为C1X,官方名称为ISO/IEC 9899:2011,新的标准提高了对C++(1983年由贝尔实验室的Bjarne Stroustrup推出,C++进一步扩充和完善了C语言,成为面向对象的程序设计语言)的兼容性,并增加了很多新的特性。1.2 C语言特性

2011年10月9日,丹尼斯·里奇去世,享年70岁,Java之父詹姆斯·高斯林(James Gosling)为此发表了纪念C语言之父丹尼斯·里奇的简短博文:“丹尼斯·里奇辞世的新闻如五雷轰顶,过去几天已经有很多资讯在报道此事,他的影响巨大,并超越了科技世界,虽然他的巨大影响可能不为人知,但完全可以感受到的是,C语言撑起了一切。我的整个职业生涯也是从C语言和UNIX中发展而来的。”全世界的计算机爱好者都以他们特有的方式纪念这位编程语言的重要奠基人,很多人在众多的国际交互论坛中发帖悼念C语言之父,全帖仅仅只用一个分号“;”(在C语言中,分号标志着一行指令语句的结束)形象地表达了人们的怀念之情。

C语言之父悄然离去,但C语言并没有因此衰退,近年来它仍然是世界主流的编程语言之一。在2019年3月的TIOBE编程语言排行榜中(如图1-1所示),C语言仍处于第2位,并呈现上升势头。

C语言主要有以下特性:

1)设计目标接近机器底层但不失跨平台性。C语言提供了许多低级处理的功能,可搭配汇编语言来使用,著名的C编译器GCC(UNIX下常用的是CC)保持着良好的跨平台的特性,以一个标准规格写出的C语言程序通过GCC(或CC)可在许多计算机平台上进行编译,甚至包含嵌入式环境以及大型机平台。

2)C语言编译生成的可执行文件短小精悍。C语言能以简易的方式进行编译,可直接处理低级存储器,仅产生少量的机器码,并且不需要任何运行环境的支持便能运行。

3)C语言虽简单但功能强大。C语言仅有32个保留字符,使用传统的结构化设计,变量具有作用域、递归等优秀功能,编译预处理使得编译更具弹性,传递参数灵活,可采用值传递和指针传递两种方式,不同的变量类型可用结构体(struct)组合在一起;此外,C指针很容易就能对存储器进行低级控制。图1-1 2019年3月TIOBE编程语言排行榜1.3 开发环境搭建

下面以“helloworld”C程序(非GUI程序,运行在Windows的控制台和UNIX/Linux系统的终端)为例,讲解Windows、类UNIX/Linux平台下的开发环境搭建(本书将以UNIX/Linux平台为主,对C指针及其应用进行讲解)。1.3.1 Windows开发环境

1.Microsoft Visual Studio

Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等。所写的目标代码适用于微软支持的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.NET Compact Framework、Microsoft Silverlight及Windows Phone。

微软公司提供了可供免费使用的Visual Studio Community 2015(其具备所有为Windows、iOS、Android设备或是云服务器开发桌面、移动、网页应用的全套功能)。读者可通过Microsoft的网站下载Visual Studio Community 2015(下载地址为:https://visuals-tudio.microsoft.com/zh-hans/vs/older-downloads/),加载ISO映射文件后再进行安装。安装完毕后再启动Visual Studio Community 2015,选择“Visual C++”项目中的“Win32控制台应用程序”(如图1-2所示)。图1-2 Win32控制台应用程序建立

单击“确定”按钮,出现向导对话框,选中“附加选项”区域的“空项目”之后,单击“完成”按钮(如图1-3所示)。图1-3 Win32应用程序向导

由于刚才建立项目时选择了“空项目”,因此需要增加C源代码文件,在源文件处点击鼠标右键,选择“添加”→“新建项”(如图1-4所示),输入源代码文件名“main.c”(如图1-5所示)。图1-4 增加C源代码文件图1-5 输入源代码文件名

在屏幕的左边输入“helloworld”的C语言代码(如图1-6所示)。图1-6 “helloworld”C语言源代码

选择“调试”菜单的“开始执行”(如图1-7所示)。图1-7 执行“helloworld”程序

程序经过编译后,执行效果如图1-8所示。

2.Code::Blocks

Code::Blocks是一个开放源码的、全功能的跨平台C/C++集成开发环境,它由C++语言开发完成,使用了著名的图形界面库wxWidgets。相比Visual Studio而言,Code::Blocks是跨越平台的C/C++IDE,支持Windows、Linux、Mac OS X平台,最重要的是它遵守GPL开源协议,Windows用户可以使用它免费编译Win应用程序以及跨平台的应用程序,而无须依赖于Visual Studio。图1-8 “helloworld”程序执行效果

Code::Blocks提供了许多工程模板,包括控制台应用、DirectX应用、动态链接库、FLTK应用、GLFW应用、Irrlicht工程、OGRE应用、OpenGL应用、QT应用、SDCC应用、SDL应用、SmartWin应用、静态库、Win32 GUI应用、wxWidgets应用、wxSmith工程等;它支持语法彩色醒目显示,支持代码自动补全,支持工程管理以及项目构建、调试;此外,它还支持插件、代码分析器、编译器的选择,同时还拥有灵活而强大的配置功能。

Code::Blocks的下载地址为http://www.codeblocks.org/downloads,Windows平台下建议下载codeblocks-13.12mingw-setup.exe安装文件,因为该安装文件不仅包括Code::Blocks本身,还将含有开源免费的mingw编译器。下载安装好Code::Blocks之后,启动它,启动过程中会显示它的logo(如图1-9所示)。图1-9 Code::Blocks启动界面

启动Code::Blocks之后,选择“New”→“Project”,新建项目(如图1-10所示)。

在项目模板中选择“Console application”(控制台程序),如图1-11所示。图1-10 新建项目图1-11 控制台程序

选择C语言为开发语言,如图1-12所示。

输入项目名称“helloworld”,同时选择项目所在的目录(如图1-13所示)。图1-12 选择C语言图1-13 输入项目名称

单击“Finish”按钮,完成项目创建(如图1-14所示)。

展开左边的项目树状图(如图1-15所示),项目模板在“main.c”中自动产生了“helloworld”的源代码。图1-14 控制台项目创建完成图1-15 自动生成的main.c

将源代码中的“Hello world!”字符串更改为中文的“您好,世界!”(如图1-16所示)。

最后,选择“Build”菜单的“Build and run”选项,编译后(如图1-17和图1-18所示),运行程序(如图1-19所示)。图1-16 “您好,世界”源代码图1-17 选择编译图1-18 进行编译图1-19 程序运行1.3.2 UNIX/Linux开发环境

目前,除了Windows系统,最流行的操作系统就是UNIX和Linux了,下面分别以这两个系统的经典代表——FreeBSD(世界上最稳定的类UNIX系统,基于UNIX的衍生系统BSD)与Ubuntu(最好用的Linux系统之一)为例,讲解C语言开发环境的部署。

1.Ubuntu开发环境

Ubuntu基于Debian发布版和GNOME桌面环境创建,是开源且免费的Linux系统,它分为桌面版和服务器版,其目标在于为用户提供一个最新的同时又相当稳定的、主要由自由软件构建而成的操作系统。Ubuntu系统既可安装在全新的电脑上,也可以与Windows操作系统并存,还可以安装在虚拟机中。下面以VisualBox虚拟机中运行的Ubuntu服务器版为例进行讲解。

1)在VisualBox虚拟机中新建Ubuntu的虚拟电脑。新建虚拟电脑,将内存设置为512MB或以上(如图1-20所示),创建4GB或4GB以上的虚拟硬盘(如图1-21、图1-22和图1-23所示)。

2)下载Ubuntu服务器版。服务器版针对服务器应用对内核做了优化,同时,对虚拟机的资源要求更少,其运行速度相对于桌面版更快,因此应选择服务器版作为学习C语言以及C指针的平台。从官网链接(http://www.ubuntu.org.cn/download/server)下载Ubuntu的服务器版(12.04版)映像文件(如图1-24所示)。

3)安装Ubuntu。首先,单击“设备”→“分配光驱”,选择一个虚拟光盘,在打开的文件菜单中选择启动光盘的映像文件(从官网上下载的服务器12.04版ISO文件);然后,启动虚拟机,选择“English”语言作为系统语言(如图1-25所示)。图1-20 设置内存大小图1-21 创建虚拟硬盘图1-22 选择虚拟硬盘大小的指定方式图1-23 指定虚拟硬盘大小图1-24 下载Ubuntu的服务器版图1-25 选择系统语言

接着,选择“Install Ubuntu Server”(如图1-26所示)。图1-26 安装服务器版

选择English作为安装语言(如图1-27所示),选择“United States”区域(如图1-28所示),随后配置键盘选项(如图1-29和图1-30、图1-31所示)。

按系统提示输入hostname(主机名,可以输入任意英文名字)后,再输入安装初始化时需要自动创建的用户名和密码(如图1-32、图1-33和图1-34所示,笔者输入的用户名为myhaspl,系统登录需要输入用户名全称、用户名及用户密码)。输入的用户密码需要验证(如图1-35所示)。图1-27 选择安装语言图1-28 选择区域图1-29 键盘配置(一)

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载