一.<<C和指针>>介绍以及书籍推荐
1.1 前言
这个部分的分享主要是我在阅读<<C和指针>>这本书的过程发现的我以前遗漏或者没有记清楚的知识点,这本书内容很多,我只做我认为容易混淆或遗漏的部分的分享,有些我认为比较简单的地方会略掉,知识点可能比较杂,我尽量为大家理请逻辑.此书共十八章,也就代表这一部分的博客会有18篇,希望大家多多支持!
1.2 书籍介绍
废话不多说,<<C和指针>>这本书是一个叫Kenneth A.Reek的工程师写的.千万不要被他的名字给吓住,这本书虽然名字是指针,但是对于C语言可以说是事无巨细、面面俱到,讲解的也非常生动,深入浅出.这本书非常适合具有一定c语言基础的同学或者C语言初学者去读.此书对C语言重点概念进行回滚理解,不仅仅可以让我们对C语言这门课程"由记忆变为意识",更增进了我们对C语言的实践能力.这里,我给出<<C和指针>>这本书的电子版下载链接供大家参考<<c和指针>>电子版网址
1.3 书籍推荐
当然,有同学可能会问在我们学习编程的道路上有没有推荐的书籍供我们学习,当然有!下面我给大家推荐一些不同编程方向建议阅读的数目,仅供参考.
C/C++方向按照顺序阅读会更好,注意有一些是精读有一些是选读
JAVA研究方向
测试开发研究方向
同学们按需阅读,具体准备读一本书前,建议先做做功课,去大致了解一下书的难度和咱们当前的学习水平匹不匹配
二. 温故
现在正式开始我们的读书分享阶段
2.1 空白和注释
C语言是一种自由格式的语言,它内部并没有要求你必须怎样书写语句.然而,如果你在编写程序的时候能够遵循一些约定,可以增加你代码的可读性,不仅仅是让别人能够很好的理解你的语法,更重要的是你回头视察你曾经写过的代码时不至于看不懂!就像下面这两种写法都没错,但明显我们更喜欢阅读第二种,因为它更加容易读懂
清晰的结构在我们写代码的过程中固然重要,但是告诉读者程序能做些什么以及怎样做则更为重要.我们的注释(comment)就是用于实现这个功能的.我们常常用这个符号 // 来写注释,如下.当系统读到//的时候,它会自动跳过后面绿字直接去读下一行,所以后面的绿字可以写任意注释来帮助读者理解我们这一行代码需要表达的意思.
值得注意的是,//这个注释符号是C++中的,但是也可以用于C语言,我们可能在以后的学习中会遇见以/* 开头和 */结尾的注释,这种符号也能用于注释比如
在C程序中,凡是可以插入空白的地方都可以插入注释。然而,注释不能嵌套,也就是说,第1个/符号和第1个/符号之间的内容都被看作是注释,不管里面还有多少个/*符号。
在有些代码中,注释有时用于把一段代码“注释掉”,也就是使这段代码在程序中不起作用,但并不将其真正从源文件中删除。如果你试图在一段代码的首尾分别加上/* 和 */符号来删除这段代码,你不一定能如愿。如果这段代码内部原先就有注释存在,这样做就会出问题。要从逻辑上真正删除一段C代码,更好的办法是使用#if指令。只要像下面这样使用:
这样,你写的代码以及注释都从你的代码中被完全删除了
值得我们注意的是,在我们平常写代码时如果不想某个代码生效,只需要用//加在代码前注释掉就行,被注释的代码也不会参与编译,这种#if语句大家要了解,但是真正使用它还是比较少的
2.2 几个需要注意的点
2.21 NUL和NULL
NUL是ASCLL码集合中’\0’字符的名称,它的值为0,NUL是被作为字符串结尾的标志,也就是说,NUL是作为字符串的终止符,并且它本身不属于字符串的一部分…然而NULL 指一个其值为 0 的指针,也就是我们常说的空指针,空指针常常是函数调用失败时的返回值,或者用来当警戒,比如这个地方若p为空指针则系统就会报错,程序就不会再继续下去
但是值得注意的是NUL和NULL的值是相等的,某种意义上他们可以互换使用,但是,你还是应该使用适当的常量,因为它不仅能告诉阅读程序的人我们使用的是 0 这个值,更重要的是告诉他我们使用这个值的目的是什么,这样可以提高我们代码的可读性.
2.22 &&和&
&&是逻辑与操作符,要使整个表达式为真,需要&&操作符两边的表达式都必须为真,**然而,如果左边表达式为假,右边的表达式程序将不会再进行运算,因为它后面不管真假,整个表达式都为假,这样我们可能就会遇见某些"坑",比如下面这个代码你们觉得输出什么?这个地方的逻辑符号全是逻辑与,只要有一个0整个表达式的值就为0,所以当程序运行到a时,a这时等于0,所以系统不会再往下走,也就是说整个表达式系统只运算了第一个a++,可以看见结果:然而,&运算符叫按位与(注意区别,&&叫逻辑与),下面我们举一个例子来说明&的使用,可以看见结果我们的分析得出吃的值为2.
所以当你实际上想使用&&操作符时,千万不要误用了&操作符。&操作符执行“按位与”的操作,虽然有些时候它的操作结果和&&操作符相同,但很多情况下都不一样!
2.3 警告的总结
1.在scanf函数的标量参数前未添加&字符。想了解scanf函数详情的请跳转scanf函数的详解
2.机械地把printf函数的格式代码照搬于scanf函数.
3.在应该使用&&操作符的地方误用了&操作符。
4.将==和=操作符混淆来测试相等性,我们说在c语言中,=符号被用作赋值,比如a=b就是将b的值赋值给a,然而当我们想要比较a和b是否相等时我们应该使用双等号符号来判断.
三. 问题探讨
3.1.C是一种自由形式的语言,也就是说并没有规则规定它的外观究竟应该怎样。但本章的例子程序
本章的例子使用空格空白加强了程序的可读性,让读者读代码的时候更容易理解作者的意思
3.2.把声明(比如函数原型的声明)放在头文件中,并且在需要的时候用#include指令把它们包含于源文件中,这样做有什么好处?
首先,#include叫预处理指令,它是由预处理器解释的.预处理器读入源代码,根据预处理指令对其修改,然后把修改过的源代码递交给编译器.比如我们常常使用的#include<stdio.h>就是把stdio.h中的内容逐条写到源文件的位置.当然c语言中不只有stdio.h这一个头文件,还有我们自己创建的头文件,我们可以把想要实现的功能写在宁外一个头文件中,然后再#include包含它,我们就可以在我们现在的源文件中使用别的文件的内容.这样使得我们的代码十分简洁,看起来更美观,当然也更容易读懂
3.3.使用#define指令给字面值常量取名有什么好处?
#define也是预处理命令的一种,它可以把字面值常量(即指定了自身的值,并且不允许发生改变)改值.比如
我们希望数组a能够存放100个元素我们就把N定义为100,当我们写了很多行代码后又发现100个元素不够用,这样我们就可以直接去到开头把N后面的值改成自己想要的值,就不用再去main函数里面苦心的寻找了.
3.4.依次打印一个十进制整数、字符串和浮点值,你应该在printf函数中分别使用什么格式代码?试编一例,让这些打印值以空格分隔,并在输出行的末尾添加一个换行符。
略
3.5.编写一条scanf语句,它需要读取两个整数,分别保存于quantity和price变量,然后再读取一个字符串,保存在一个名叫department的字符数组中.
略
3.6.C语言并不执行数组下标的有效性检查。你觉得为什么这个明显的安全手段会从语言中省略?
C的委员会为了强调C的灵活性采用充分相信程序员的做法 让程序员去保证程序的正确性,这虽然提高了c语言的灵活性,但是也让很多新手程序员甚至许多"老司机"感到烦恼.
3.7.strcpy函数只接受两个参数,所以它实际上所复制的字符数由第2个参数指定。在本程序中,如果用strcpy函数取代strncpy函数会出现什么结果?
首先strcpy函数接受的两个参数destination和source是将source中的所有元素拷贝到destination中,直到source走到’\0’,然而strncpy函数有三个参数,前两个参数和strcpy一样,第三个参数传入一个无符号整型,代表从source中拷贝多少个元素到destination中,他们的官方解释给大家放在下面(size_t指无符号整型,等于unsigned int)
|
编程练习
略!
若有写的不对或不全的地方,请在评论区提出,一定虚心接受!