《好学的C++ 第2版》 第6章 指针--我知道数据在哪里
指针就是容纳着一个地址的变量。利用指针来减少数据复制,以及更改原始数据,还可以在内存里构造出链表和内部网络等复杂数据结构。
每种计算机体系结构使用的地址都有某一固定的宽度,能一眼看出某个地址是否过大以至于不适用某个特定的计算机,这种能力很重要。
目前电脑的物理内存已经超过了32位地址的寻址范围(40亿多),需要操作系统的码农去弥补这个差距。迟早64位体系结构成为主流,会支持近乎无穷的地址数量。
除了数组和类意外,不要对变量在内存里的位置做出假定。
星号操作符被称作间接操作符。
int arr[5]; int* p=arr;//arr是保存着数组第一个元素地址的常量(it:指针常量),值不能被改变,但变量指针p可以获取它的值。c++把数组名解释为地址表达式,arr[3]即*(a+3)
指针运算规则:
地址表达式+整数
整数+地址表达式
地址表达式-整数
地址表达式-地址表达式
地址之间可以进行大小比较(但数组以外的数据类型在内存中的顺序不能保证)。
编译器完成以下转换:
新地址=旧地址+(整数*基类型的单位长度)
用指针会比用数组下标执行稍微快一点。尤其是遍历,指针每次只执行两个加法(循环变量递增与指针递增。更快的方法是先保存pmax=p+len,然后遍历条件是p<pmax,都不用循环变量),而数组要执行一次乘法和一次加法。
it:为何给函数传入数组参数时,往往同时传入数组大小:只有这样才能遍历地完整地处理数组。
想给函数传递一个数组,只需传递该数组的名称即可。函数会获得第一个元素的地址并把它当做指针来对待。//it: 函数入参int* a与int a[]有无区别?a是常量指针还是变量指针?
*与++优先级相同,但它们都是从右往左结合,因而*p++等价于*(p++)