编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

豆瓣9.0,百万程序员的宝藏书,C语言进阶必看

gowuye 2024-04-25 04:45 8 浏览 0 评论

著名作家肯尼斯·里科(Kenneth Reek)说过:是指针使C语言威力无穷。


指针为什么如此重要?C语言圈内有一句经典的自嘲:C语言就只有指针可以用了。


如果你干掉struct、干掉union、干掉数组、甚至你把if-while都干掉、只留下malloc和goto,最多就是程序难写一点而已;但如果你把指针干掉,那C语言就完了。


你会用指针、用好指针之后,就能发挥C语言的强大威力;如果你不会用,C语言其实不会比其他的任何一种语言好。所以当你想要进阶你的C语言能力时,对指针有一个深入而完整的理解是必不可少的。这也正是《C和指针》面世12余年,能够被无数程序员奉为宝藏书的原因。


这本书通过对指针的基础知识和高级特性的探讨,帮助程序员把指针的强大功能融入到自己的程序中去。全书共18章,覆盖了数据、语句、操作符和表达式、指针、函数、数组、字符串、结构和联合等几乎所有重要的C编程话题。



《C和指针》在豆瓣上有9.0的评分,海量好评当中,不少读者都笑侃作者是个“起名废”,因为这本书的涵盖的内容其实大大超过了指针。毕竟想要成为一名优秀的C语言程序员,进阶必学知识点还真是不少。下面我们就来一起看看吧~


C语言进阶应该学什么


当你掌握了C语言的基本语法、或是具备一定的编程经验后,千万不要因为“为什么循环很重要”以及“何时需要使用if语句”等肤浅问题耽误进程,不论你想要进阶的原因是钻研C语言本身、还是想要以C为基础得到更好的职业发展,以下5点都是很必要的:


一:操作符和表达式

C提供了我们希望编程语言应该拥有的所有操作符,它甚至提供了一些令人意想不到的操作符。事实上,C被许多人所诟病的一个缺点就是它有品种繁多的操作符——C的这个特点使它很难被精通。


但是,C的许多操作符具有其他语言的操作符无可抗衡的价值,这正是C适用于开发范围极广的应用程序的原因之一。C语言进阶,搞清楚操作符优先级和算术转换是重要的一课。


二:数据、结构和联合以及动态内存分配

程序对数据进行操作,数据又经常以成组的形式存在。例如,雇主必须明了每位雇员的姓名、年龄和工资。如果这些值能够存储在一起,访问起来会简单一些。但是,如果这些值的类型不同,则无法存储于同一个数组中。在C中,使用结构可以把不同类型的值存储在一起。


数组的元素存储于内存中连续的位置上。当一个数组被声明时,它所需要的内存在编译时就被分配。但是,也可以使用动态内存分配在运行时为它分配内存。那么什么时候应该使用动态内存分配?怎样进行动态内存分配?想成为一名合格的C语言程序员,这些你都了解了吗?


三:字符串、字符和字节

字符串是一种重要的数据类型,但是C语言并没有显式的字符串数据类型,因为字符串以字符串常量的形式出现或者存储于字符数组中。字符串常量很适用于那些程序不会对它们进行修改的字符串。处理字符串和字符的库函数,以及一组既可以处理字符串也可以处理非字符串数据的相关函数是进阶C语言的一道不小的门槛。


四:预处理器

编译一个C程序涉及很多步骤。其中第一个步骤被称为预处理(preprocessing)阶段。C预处理器(preprocessor)在源代码编译之前对其进行一些文本性质的操作。它的主要任务包括删除注释、插入被#include指令包含的文件的内容、定义和替换由#define指令定义的符号,以及确定代码的部分内容是否应该根据一些条件编译指令进行编译。


五:指针


C语言只有值的传递,无法直接传递引用,要想传递引用必须通过指针间接实现。要搞明白指针,就要搞明白:内存和地址、值和类型、指针变量的内容、NULL指针、指针常量、指针的表达式、指针运算等等......这就是为什么指针被称为C语言进阶最大boss的原因了。


新手面对指针的常见问题


C语言的指针很重要,但新手进阶C语言时,指针相关的问题往往是最多的,这里给大家挑选了两个常见问题,看看你对这几点了解吗?


一、未初始化和非法的指针

下面这个代码段说明了一个极为常见的错误:



这个声明创建了一个名叫a的指针变量,后面那条赋值语句把12存储在a所指向的内存位置。但是究竟a指向哪里呢?


我们声明了这个变量,但从未对它进行初始化,所以没有办法预测12这个值将存储于什么地方。从这一点看,指针变量和其他变量并无区别。如果变量是静态的,它会被初始化为0;如果变量是自动的,它根本不会被初始化。无论是哪种情况,声明一个指向整型的指针都不会“创建”用于存储整型值的内存空间。


所以,如果程序执行这个赋值操作,会发生什么情况呢?


如果运气好,a的初始值会是个非法地址,这样赋值语句将会出错,从而终止程序。在UNIX系统上,这个错误被称为“段违例”(segmentation violation)或“内存错误”(memory fault)。它提示程序试图访问一个并未分配给程序的内存位置。在一台运行Windows的PC上,对未初始化或非法指针进行间接的访问操作是一般保护性异常(general protection exception)的根源之一。


对于那些要求整数必须存储于特定边界的机器而言,如果这种类型的数据在内存中的存储地址处于错误的边界上,那么对这个地址进行访问时将会产生一个错误。这种错误在UNIX系统中被称为“总线错误”(bus error)。


一种更为严重的情况是,这个指针偶尔可能包含了一个合法的地址。接下来的事很简单:位于那个位置的值被修改,虽然你并无意去修改它。像这种类型的错误非常难以捕捉,因为引发错误的代码可能与原先用于操作那个值的代码完全不相干。所以,在对指针进行间接访问之前,必须非常小心,确保它们已被初始化!


二、高级声明

在使用更高级的指针类型之前,我们必须观察它们是如何声明的。


我们可以来看几个简单的例子:


int        f();

它把f声明为一个函数,它的返回值是一个整数。旧式风格的声明对函数的参数并未提供任何信息。它只声明f的返回值类型。现在将使用这种旧式风格,这样例子看上去简单一些,后面再回到完整的原型形式


int    (*f)();

确定括号的含义是分析这个声明的一个重要步骤。这个声明有两对括号,每对的含义各不相同。第2对括号是函数调用操作符,但第1对括号只起到聚组的作用。它迫使间接访问在函数调用之前进行,使f成为一个函数指针,它所指向的函数返回一个整型值。


函数指针?是的,程序中的每个函数都位于内存中的某个位置,所以存在指向那个位置的指针是完全可能的。


int        *(*f)();

它和前一个声明基本相同,f也是一个函数指针,只是所指向的函数的返回值是一个整型指针,必须对其进行间接访问操作才能得到一个整型值。


通过以上不难看出,指针虽然很强大,与之相伴的风险却也不小。就像指甲锉和链锯,链锯可以更快地切割木材,但链锯更容易让人受伤,而且伤害常常来得极快,后果也非常严重。


指针就像链锯一样,如果使用得当,它们可以简化算法的实现,并使其更有效率;如果使用不当,它们就会引起错误,导致细微而令人困惑的症状,并且极难发现原因。所以对指针只是略知一二便放手使用是件非常危险的事。


想要学好指针,最好的办法就是有一位导师在身后注视你的工作,时不时给你一些提示和警告。导师是谁?当然是它


C和指针

作者: [美]肯尼斯·里科(Kenneth Reek)


C和C++经典著作:C和指针 POINTERS ON C(异步图书出品)

作者:[美]里科(Kenneth·Reek)


内容简介:

《C和指针》提供与C语言编程相关的全面资源和深入讨论。本书通过对指针的基础知识和高级特性的探讨,帮助程序员把指针的强大功能融入到自己的程序中去。全书共18章,覆盖了数据、语句、操作符和表达式、指针、函数、数组、字符串、结构和联合等几乎所有重要的C编程话题。


本书特色:

本书的写作目标是把通常需要多年实践才能获得的知识和观点传授给读者。这种组织形式也影响到书中内容的顺序——通常在一个地方引入一个话题,并进行完整的讲解。


书中给出了很多编程技巧和提示,每章后面有针对性很强的练习,附录部分则给出了部分练习的解答。《C和指针》适合C语言初学者和初级C程序员阅读,也可作为计算机专业学生学习C语言的参考。

相关推荐

Nginx 响应提速10倍,你需要知道的缓存性能优化——FastCGI调优
Nginx 响应提速10倍,你需要知道的缓存性能优化——FastCGI调优

Nginx缓存优化是帮助大家提升网站性能的重要操作之一,proxy_cache主要用于反向代理时,对后端内容源服务器进行缓存;fastcgi_cache主要用于...

2024-05-20 14:44 gowuye

王者荣耀天魔缭乱和逐梦之音返场活动地址 3月22日开启返场活动
王者荣耀天魔缭乱和逐梦之音返场活动地址 3月22日开启返场活动

王者荣耀官方终于确定了天魔缭乱和逐梦之音的返场活动,这让不少小伙伴乐开了花,返场活动将会在3月22日开启,下面就带来王者荣耀天魔缭乱和逐梦之音返场活动地址!王者...

2024-05-20 14:44 gowuye

常见的嵌入式web服务器有哪些?

嵌入式WEB服务器常见的有:Lighttpd,Shttpd,Thttpd,Boa,Mini_httpd,Appweb,Goahead。Lighttpd地址:http://www.light...

简述几款常见的嵌入式web服务器
简述几款常见的嵌入式web服务器

嵌入式web服务器,是web服务器当中的一种,是基于嵌入式系统而实现的web服务器。指的是在嵌入式系统(通俗点就是单片机系统)上实现的一个web服务器,可以通过...

2024-05-20 14:44 gowuye

教你如何利用fastcgi_cache缓存加速WordPress

在使用nginx缓存之前,必须在nginx里面加载专门的模块,这个模块叫做ngx_cache_purge。添加ngx_cache_purge模块下载ngx_cache_purge模块ngx_cache...

扫描WordPress漏洞

检测已知漏洞WPScan是一款广泛使用的WordPress安全扫描工具,它的一项重要功能是检测已知漏洞。在这篇文章中,我们将深入探讨WPScan如何检测已知漏洞,并结合实际示例,帮助读者更好地理解和应...

消灭 Bug!推荐几个给力的开源 Bug 跟踪工具
消灭 Bug!推荐几个给力的开源 Bug 跟踪工具

在这个充满bug的世界里,最遥远的距离不是生与死,而是你亲手制造的bug就在你眼前,你却怎么都找不到它。因此本文准备了7款优秀的开源bug跟踪系...

2024-05-20 14:43 gowuye

生物信息分析入门全攻略

生物信息学是生命科学研究的重大前沿领域,未来将占据生命科学研究的半壁江山。已经有越来越多的小伙伴投入到生物信息的学习中,但是入门难、深入慢、摸不到方向等都成为持续学习的拦路虎。本文根据生物信息技术大牛...

elkb实践经验,再赠送一套复杂的配置文件
elkb实践经验,再赠送一套复杂的配置文件

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。宝剑锋从磨砺出,梅花香自苦寒来。诗人白居易,三月下江南,看到沿路开放的桃花,心潮澎湃...

2024-05-20 14:43 gowuye

超详细从0到1 搭建ELK监控
超详细从0到1 搭建ELK监控

监控分类?Metrics用于记录可聚合的数据。例如,1、队列的当前深度可被定义为一个度量值,在元素入队或出队时被更新;HTTP请求个数可被定义为一个计数器,...

2024-05-20 14:42 gowuye

嵌入式开发 之Web配置页面开发
嵌入式开发 之Web配置页面开发

1.PHP是最好的语言??开发动态页面首选的语言是PHP,村村不能在这里忽悠人,如果你的硬件性能允许切略懂PHP,看到这里就可以退出了。本文面向的受众是Linu...

2024-05-20 14:42 gowuye

Python开发一个网站目录扫描工具用来检测网站是否有漏洞?
Python开发一个网站目录扫描工具用来检测网站是否有漏洞?

开发一个网站目录扫描工具是用来检测网站是否有非法目录请求的一个常见需求之一,我们要通过这个扫描工具来找到通过某个域名可以访问到的网站路径,可能对于有些系统来讲,...

2024-05-20 14:42 gowuye

创建一个类似Youtube的Id——使用PHP/Python/JS/Java/SQL

id通常都是用数字,不巧的是只有10个数字来使用,所以如果你有很多的记录,id往往变得非常冗长。当然对于计算机来说无所谓,但我们更希望id尽可能短。所以我们如何能使id变短?我们可以利用字母让它们附加...

快速云:有助于移动应用安全开发的五条妙计
快速云:有助于移动应用安全开发的五条妙计

许多企业不断地向其开发团队提供培训。但是某些漏洞,如早在十多年前就发现的SQL注入,如今仍广泛存在于各种应用中。因而,安全培训永不过时。在开发移动应用时,开发者...

2024-05-20 14:41 gowuye

洛杉矶国际电影节最佳动画短片奖影片《G’DAY》正式全网上映
洛杉矶国际电影节最佳动画短片奖影片《G’DAY》正式全网上映

7月2日,由M&CSaatchi创作,由深受好评的澳大利亚导演迈克尔·格雷西执导的动画短片《G’day》,正式在全网上映。该影片因其出色的创意赢得了洛...

2024-05-20 14:41 gowuye

取消回复欢迎 发表评论: