3月6日C Primer Plus 读书笔记(第十章:指针)

向函数传递数组信息的方法:
第一种是使用一个指针参量来确定数组的开始点,使用一个整数参量来指明数组的元素个数。
第二种是传递两个指针,第一个指针指明数组的起始地址,第二个指针指明数组的结束位置。


指向数组之后的第一个位置的指针也是有效的。但是如果超出了这个范围,后果是未知的。
一元运算符*和++具有相等的优先级,但它在结合时时从右向左进行的。
例:total+=*start++;注:一般更喜欢使用*(start++).
这个就意味着++应用于start,而不是应用于*start。
也就是说,这是指针自增1,并不是指针指向的数据自增1.
例:区分下类问题。
*++start:这个指的是指针先自增1,然后再使用其指向的值。
(*start)++:会使用指针所指向的数据,然后再使该数据自增1.
注意,在这里面,只有(*start)++改变了数组元素的值。其他操作增加了指针p1和p2,使这两个指向了下一个数组元素。


在C中,可以知道两个表达式ar[i]和*(ar+i)是等价的。只有当ar是一个指针变量的时候,才可以使用ar++这样的表达式。

指针赋值,可以把一个地址赋给指针,通常使用数组名或者地址运算符&来进行地址赋值。
当将一个整数加给指针——可以使用+运算符来吧一个整数加给一个指针,或者把一个指针加给一个正数。两种情况下,这个整数都会和指针所指类型的字节数相乘,然后得到的结果加到初始的地址上。
增加指针的值——可以通过一般的假发或增量运算符来增加一个指针的值。对指向某数组元素的指针做增量运算,可以让指针指向数组的下一个元素,所以,ptr++运算吧ptr1加上数值4(int为4个字节)。
从指针中减去一个整数——这个整数都会和指针所致类型的字节数相乘,然后所得的结果会从初始地址中减掉。如果想减的结果超出了出事指针所指向的数组范围,那么这个结果是不确定的,除非超出数组最后一个元素的地址能够确保是有效的。
减小指针的值——可以使用前缀和后缀形式的增量和减量运算符。
求差值——通常对分别指向同一个数组内两个元素的指针求差值,以求出元素之间的距离。差值的单位是相应类型的大小。
例:ptr2-ptr1的值为2,表示指针所指向的对象之间的距离为2个int数值大小,而不是两个字节。有效差值运算的前提必须是参加运算的两个指针是指向同一个数组。

当两个指针具有相同的类型,可以使用关系运算符来比较两个指针的值。

不能对指向数组后的第一个地址的指针进行取值运算。


使用指针,有一个特别需要注意的:不能对未初始化的指针取值。
例:int *pt;//未初始化指针
       *pt=5;//一个错误
由于指针没有被初始化,所以指针的值是随机的,这样就不知道对指针的赋值会储存在什么位置,这个位置也许会覆盖陈旭数据或者代码,甚至导致程序的奔溃。
切记:当创建一个指针时,系统只分配了用来存储指针本身的内存空间,并不分配用来存储数据的内存空间。所以在使用指针之前,必须给它赋予一个已分配的内存地址。
比如:可以把一个已存在的变量地址赋给指针,。或者使用malloc函数分配内存。


对于处理数组的函数,只能传递指针,原因是这样效率更高。

关于const形式参量的使用:
当函数不改变数组的内容,可以在函数声明前加上const。在这时函数无法修改数组中的数据,这样数组会更加安全。


通常把指向常量的指针用作函数参量,以表明函数不会用这个指针来修改数据。
关于指针赋值和const有规则:将常量或非常量数据的地址赋给指向常量的指针是合法的。只有非常量数据的地址才可以赋给普通的指针。
const还可以在声明初始化指针时使用,以保证指针不会指向别处。
还可以使用两个const来创建指针,这个指针既不可以更改所指向的地址,也不可以修改所指向的数据。










你可能感兴趣的:(C语言)