2013年6月14日7:02:52
2013年6月15日9:09:23
2013年6月16日14:04:34
开启我的C之路,先玩指针和数组
笔记:
5.1 指针与地址
1、指针是一种保存变量地址的变量
2、原因:指针常常是表达某个计算的唯一途径、同其它方法比较起来,使用指针通常可以生产更高效、更紧凑的代码
3、通常的机器都有一系列连续编号或地址的存储单元,这些存储单元可以单个进行操作,也可以以连续成组的方式操纵
4、指针是能够存放一个地址的一组存储单元(通常是两个或四个字节)
5、& 可用于取一个对象的地址。只能应用于内存中的对象,即变量与数组元素。不能作用于表达式、常量或register类型的变量
* 是间接寻址或间接引用运算符。当它作用于指针时,将访问指针所指向的对象
6、指针只能指向某种特定类型的对象,即,每个指针都必须指向某种特定的数据类型
(一个例外情况是指向 void类型的指针可以存放指向任何类型的指针,但它不恩能够间接引用其自身)
7、类似于 * 和++ 这样的一元运算符遵循从右至左 的结合顺序
5.2 指针与函数参数
8、由于指针也是变量,所以在程序中可以直接使用,而不必通过间接引用的方法使用
9、指针参数使得被调用函数能够访问和修改主调函数中对象的值
5.3 指针与数组
10、一般来说,用指针编写的程序比用数组下标编写的程序执行速度快,但另一方面,用指针实现的程序理解起来要稍微困难一些
11、指针是一个变量、数组名不是变量
12、当把数组名传递给一个函数时,实际上传递的是该数组第一个元素的地址。在被调用函数中,该参数是一个局部变量,因此,数组名参数必须是一个指针,也就是一个存储地址值的变量。
5.4 地址算术运算
13、C 语言中的地址算术运算方法是一致且有规律的,将指针、数组和地址的算术运算集成在一起是C 语言的一大优点
14、一般情况下,同其它类型的变量一样,指针也可以初始化。通常,对指针有意义的初始化值只能是 0 或者表示地址 的表达式,对表达式来说,其所代表的地址必须是在此前已定义的具有适当类型的数据的地址
15、指针与整数之间不能相互转换,但 0 是唯一的例外:常量 0 可以赋值给指针,指针也可以和常量 0 进行比较。程序中经常用符号常量 NULL 代替常量 0,这样便于更清晰地说明常量 0 是指针的一个特殊值。符号常量 NULL 定义在标准头文件<stddef.h> 中。
16、指针算术运算的几个重要特点:
在某些情况下对指针可以进行 比较运算。任何指针与 0 进行相等或不等的比较运算都有意义。但是,指向不同数组的元素的指针之间的算术或比较运算没有意义
(特例:指针的算术运算中可使用数组最后一个元素的下一个元素的地址)
指针可以和整数进行相加或相减运算
17、指针的算术运算具有一致性:如果处理的数据类型是比字符型占据更多存储空间的浮点类型,并且 p 是一个指向浮点类型的指针,那么在执行p++ 后,p 将指向下一个浮点数的地址
18、所有的指针运算都会自动考虑它所指向的对象的长度
19、有效的指针运算包括:
相同类型指针之间的赋值运算
指针同整数之间的加法或减法运算
指向相同数组中元素的两个指针间的减法或比较运算
将指针赋值为 0 或指针与0之间的比较运算
其它所有形式的指针运算都是非法的
不经强制类型转换而直接将指向一种类型对象的指针赋值给指向另一种类型对象的指针的运算(两个指针之一是void *类型的情况除外)
5.5 字符指针与函数
20、字符串常量是一个租房数组。字符串常量占据的存储单元数比双引号内的字符数大 1
21、字符串常量最常见的用法是作为函数参数。还可以将一个指向该字符数组的指针赋值给某一指针变量,不过该过程只有指针的操作没有进行字符串的复制
22、C 语言没有提供将整个字符串作为一个整体进行处理的运算符
5.6 指针数组以及指向指针的指针
23、由于指针本身也是变量,故它们也可以像其它变量一样存储在数组中
24、通常情况下,最好将程序划分成若干与问题的自然划分相一致的函数,并通过主函数控制其它函数的指向
5.7 多维数组
5.8 指针数组的初始化
5.9 指针与多维数组
25、指针数组最频繁的用处是存放具有不同长度的字符串
5.10 命令行参数
26、在支持 C 语言的环境中,可以在程序开始执行时将命令行参数传递给程序。调用住函数 main 时,它带有两个参数。第一个参数(习惯上称为 argc,用于参数计数)的值表示运行程序时命令行中参数的数目;第二个参数(称为 argv,用于参数向量)是一个指向字符串数组的指针,其中每个字符串对应一个参数。通常用多级指针处理这些字符串。
5.11 指向函数的指针
27、在 C 语言中,函数本身不是变量,但可以定义指向函数的指针。这种类型的指针可以被赋值、存放在数组中、传递给函数以及作为函数的返回值等
5.12 复杂声明
28、C 语言的声明不能从左至右阅读,而且使用了太多的圆括号
情况:
1、对于指针的大量使用,在 linux 内核中得到了很好的推广,尤其是内核通过 双向链表 来组织源码,各种优越性大展雄风
2、自动化控制 在进行通讯时候,最常使用的通讯协议应该是 modbus 了,而它的开源码版本freemodbus 则通过使用函数指针的方式来提高不同平台的移植性
链接:
说明:
以上观点仅仅是自己学习中的一些积累,若有差错,敬请指正