1、指针与地址
地址运算符只能用于内存中的对象,不能用于表达式、常量或register类型的变量。
2、指针与函数参数
3、指针与数组
这里从定义上弄清楚即可,数组类型的变量或表达式就是该数组第0个元素的地址,但数组名又不同于指针,前者不是一个变量。
为啥“一般来说,用指针编写的程序比用数组下标编写的程序执行速度快”?
4、地址算术运算
C语言是把指针、数组和地址的算术运算集成在一起的。首先给出有效的指针运算:
相同类型指针之间的赋值运算;
指针同整数之间的加法或减法运算;
指向相同数组中元素的两个指针间的减法或比较运算;
将指针赋值为0或指针与0之间的比较运算。
对于指针的初始化,有意义的只能是0(NULL)或者表示地址的表达式,对于后者来说,表达式所代表的地址必须是在此前已定义的具有适当类型的数据的地址。这个好像是怕如果不做初始化,那么之前存在的野值指向的地址可能对系统有影响。
上面提到的0可以具体讲讲。作者提到,“C语言保证,0永远不是有效的数据地址,因此,返回值0可用来表示发生了异常事件”。0是唯一可以与指针相互转换的整数,可以赋值,也可以与其进行相等或不等的比较。
书里有一句话没明白是什么意思:“这里有一个特例:指针的算术运算中可使用数组最后一个元素的下一个元素的地址。”?
5、字符指针与函数
解释了char c[]和char * c之间的区别:前者定义数组,其中的单个字符可以修改,而后者仅是定义了指向字符串第一个字符的地址的指针,如果试图修改其中的内容,结果是没有定义的。
此外,这里提到了进栈和出栈的标