原创 【博客大赛】《C和指针》摘抄整理型笔记一

2014-10-9 16:05 7420 15 24 分类: 处理器与DSP 文集: C和指针

/*

读书笔记类型多种多样,有摘抄型的,有感想型的,有批注型的,有摘要型的……

现在正在研读《C和指针》,其中有很多我认为必要的知识点,摘抄并简单整理了一下,记录在这里。

*/

1. 数值是以引用(reference)形式进行传递,也就是传址调用;标量和常量按值(value)传递。所有传递给函数的参数都是按值传递的,但是,数组名作为参数时就会产生按引用传递的效果。

/*个人观点:数组其实是指针应用的一个特例,所以编译器没有必要去检查数组下标是否越界,当然,这也提高了编译的效率。*/

 

2. 不良的风格和不良的文档是软件生产和维护代价高昂的两个重要原因。在函数定义中,返回类型出现在独立一行中,而函数名则出现在下一行起始处,这样在寻找函数定义时,你可以在一行的开头处找到函数的名字。

/*作者的经验,可以参考,但未必符合每个人的习惯*/

 

3. 数组使用方面的一个良好经验法则:如果下标值是从那些已知是正确的值计算得来,那么就无需检查它的值,如果一个用作下标的值是根据某种方法从用户输入的数据产生而来的,那么在使用它之前必须进行检测,确保它们位于有效范围之内。

 

4. 容易“被愚弄”的地方:

1)声明指针:

例如:int* b, c, d;

人们很自然地以为这条语句把所有三个变量都声明为指向整型的指针,但事实上星号是表达式*b的一部分,只对这个标识符有用。b是一个指针,其余两个变量cd只是普通的整型。要声明三个指针,正确的语句是:

int *b, *c, *d;

2)声明指针并赋值:

例如: char *message = “Hello world”;

这条语句是指message声明为一个指向字符的指针,并用字符串常量中的第一个字符的地址对该指针进行初始化。这样的声明很容易引起误解,看上去好像初始值是赋给了表达式*message,事实上它是赋给了message本身。上面的声明相当于:

char *message;

message = “Hello world”;

 

5. 创建新的类型名,宜使用typedef而不用#define,因为后者无法正确处理指针类型,如:

#define d_ptr_to_char char *

d_ptr_to_char a, b;

正确地声明了a,但b却被声明为一个字符。如果使用typedef就会避免这个问题。

 

6. 常量与指针在一块使用的情况:

int const *pc;  //是一个指向整型常量的指针,可修改指针的值,但不能修改它所指向的值。

int *const cp;  //是一个指向整型的常量指什,此时,指针是常量,它的值无法修改,但可以修改它所指向的整型的值。

int const *const ccp; //无论指针本身还是它所指向的值,都是常量均不允许修改。

 

7. 对于auto变量,除了声明为const的变量外,在声明变量的同时进行初始化和声明后赋值只有风格之差,并无效率之别。

 

8. static用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响,用这种方式声明的函数或变量只能在声明它们的源文件中访问。

当用于代码内部的变量声明时,static关键字用于修改变量的存储类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响。用这种方式声明的变量在程序执行前创建,并在程序的整个执行期间一直存在,而不是每次在代码块开始执行时创建,在代码执行完毕后销毁。

无标题.jpg

 

9. for语句和while语句执行过程的区别在于出现continue语句时。在for语句中,continue语句跳过循环体的剩余部分,直接回到调整部分;在while语句中,调整部分是循环体的一部分,所以continue语句将会把它也跳过。

for循环有一个风格上的优势,它把所有用于控制循环的表达式收集在一起,放在同一处,便于寻找。

 

10. 跳出多层嵌套循环的方法:

1)使用goto语句,因为break语句只影响包围它的最内层循环体;

2)当希望退出所有循环时设置一个状态标志,但这个标志在每个循环中都必须进行测试;

3)把所有循环放在一个单独的函数中,当要从最内层循环跳出时,使用return语句离开这个函数。

PARTNER CONTENT

文章评论9条评论)

登录后参与讨论

用户1824314 2014-12-23 23:07

我也想要精读《C和指针》 向楼主学习

用户377235 2014-10-18 07:30

最 难掌握的和最难学的C指针。支持楼主

用户377235 2014-10-11 13:25

char *message = "Hello world"; 相当于: char message[12]; strcpy(message, "Hello world");

用户1715426 2014-10-11 10:06

指针是个易混淆点,整理成笔记真心不错

用户1758662 2014-10-9 09:04

太精妙了

用户377235 2014-10-5 21:02

c 的关键之处-指针、支持一下!

用户385411 2014-9-30 08:30

指针的地方容易出错,记得上学时老师就反复强调容易混淆的地方

残弈悟恩 2014-9-29 20:52

精华中的精华。

用户1228444 2014-9-28 15:40

C的精华就是指针,支持博主。
相关推荐阅读
飞言走笔 2017-01-06 21:56
2017,新的博客旅程
EDNChina 改版终于成功了!祝贺! 2017年,开始新的旅程~ ...
飞言走笔 2016-06-01 10:17
【博客大赛】《白鹿原》读后
《白鹿原》这本书已经买了很久,多次以来,都是只翻看几页,顶多几章就放下了,觉得这是一个大部头,得有足够的时间才行。前几天陈忠实先生去世的消息传来,让我很震惊和惭愧。 一口气读完这本书,畅快淋漓,又意...
飞言走笔 2016-03-26 16:42
【博客大赛】《毛斯朝》读后
这本书最早是在凤凰卫视曾子墨主持的一期关于沈志华先生的《世纪大讲堂》节目中知晓的。但是一直拖到今天才读完。 说实话,书的主要内容与当前官方的宣传口径有很多不一致的地方,而沈先生作为中国掌握苏联档...
飞言走笔 2016-03-08 13:46
【博客大赛】蓝牙4.0低功耗技术及其认证要求
详见附件 ...
飞言走笔 2016-02-02 14:20
【转】蓝牙4.0协议官方手册(一)——通用属性配置文件
转自:http://blog.csdn.net/jinzhichaoshuiping/article/details/43370009 通用属性配置文件 (GATT)——该说明书定义了通用属性配置...
飞言走笔 2016-01-31 23:24
【博客大赛】脑洞大开、三观重塑——《人类简史》读后
终于读完了《人类简史》,没有把这本书拖到二月份,这也是2016年读完的第一本书。之前也有所耳闻,但是没有太在意,倒是罗胖子的跨年演讲上偶然提到,不知怎么就勾起了阅读此书的欲望。 本文的标题用了“脑洞...
EE直播间
更多
我要评论
9
15
关闭 站长推荐上一条 /3 下一条