指针的概念
今天学习了指针,指针就是用来存放地址的变量。系统会分配内存单元用来存放数据,内存单元的大小以字节为单位,每一个内存单元都有一个编号,称为地址。
32位Bit系统范围0x00000000-0xFFFFFFFF;在32bit位的平台下,地址总线32为=位,所以地址编号,指针变量就是32位即4个字节。
指针的定义
指针变量和普通变量一样,先声明后使用。
声明指针变量时可以直接赋初值,也可以通过赋值语句的赋值方式来赋值。
注意:①指针没有赋值时,其指向时不稳定的,可能会破坏内存中其他单元的内容,严重时会造成系统失控。
②可以把指针变量初始化为空指针。例如:
说明:
①指针变量也占用内存单元,所有指针变量占用内存单元的数量都是相同的(整型)。
②" * "表示该变量为指针变量,以区别于普通变量,而指针变量并不包含" * "。" * "是单目运算符,,其结合性是自右至左的。他的作用是取指针变量所指向数据单元的值,即通过指针变量来间接访问它所指向的变量。
注意:在指针变量定义时的" *p "和程序运算过程中的" *p "是有区别的。在定义时" * "是为了区分简单变量,表示定义的变量类型是指针型,不是运算符;而在程序的执行语句中," *p "中的" * "是指针运算符,它表示取p所指向的变量的值。
例如:
③指针变量可以指向任何类型的对象,包括数组,指针变量,函数或结构体类型变量等,从而可以表示复杂的数据类型。
④寄存器变量不可使用指针。
注意:一个指针变量被定义后,它所指向对象的类型就确定了。所以,在一般情况下指针变量只能指向由定义限定的同一类型的变量,若要指向其他类型的变量,要进行强制类型转换。例如:
指针与数组
在C语言中,指针与数组有着密切的关系。访问数组元素有两种办法:下标法和指针法。任何能由数组下标完成的操作都能由指针来实现,而且使用指针比用下标对数组元素的存取操作更方便,速度更快,数组元素的指针是数组元素的地址,数组元素的地址是指它所占内存单元的首地址。例如:
注意:p和arr的不同,p是指针变量,而arr是个常量,所以可以给p赋值,但不能给a赋值
下标方式运算实际上是变址运算(下标运算符[ ])。对a[ i ]的求解过程是:先找到数组的首地址(数组名代表数组的首地址),再按a + i * d(d为数组长度)计算数组元素的地址,然后找出地址存放a [ i ]。
元素的地址就是元素的指针,第 i 个元素的地址按照指针的表示方法,可以表示为 a + i,指针 a + i 指向的元素可以表示为 *(a + i),所以,a[ i ]等价于 *(a + i),而地址 a + i等价于 &a[ i ]。
如果有p = a,则 p + 1 即 p 指向了 a[ 1 ] 的地址(p = &a[ 1 ]), p + 2为 a[ 2 ]的地址,...,p + i为 a[ i ]的地址。那么,元素a[ i ]就可以表示为*(p + i)。
从下标运算的过程中可以看出,下标运算的原理和指针运算的原理是一样的,故 *(p + i),也可以使用" [ ] "运算符表示成 p[ i ]。