C语言中指针算是核心了吧,掌握了指针基本上就掌握的了C语言的精髓,不过要想真正掌握指针,还是需要仔细认真的钻研一番的。这里我就浅谈一下我对指针的理解吧。以下是我的个人理解,有不同见解的欢迎和我一起探讨。
什么是指针?
在说指针之前先说一下什么是地址吧。我们可以把计算机的内存比作蜜蜂的巢,由一个一个的小格子构成,内存中的小格子都是按顺序进行编号的,这些编号就是我们说的地址了。每一个小格子都可以存放一个字节(byte)大小的数据,包含8个位(bit)。指针呢,简单的说就是一个地址。
大家都知道指针变量就是存放地址的变量。这句话说的很对,但是太表面了。我们思考一个问题“如果指针仅仅是存放地址的变量,那么为什么指针变量还要有类型?”我的理解是指针是存放一定大小空间的首地址的变量。一个指针变量不仅存了一个地址还定义了这指针指向空间的大小。
指针和数组
说到指针和数组,可以说这两个概念之间的关系密不可分,如果你不能理解其中一个概念,也就不能理解另一个概念。
举个栗子
:
我们有一个数组 :int arr[5] = {0,1,2,3,4}; 然后我们获取中间的元素arr[2]的值时有两种操作方式。
那么对于二维数组的话两两组合就有四种操作方式了。
对于数组需要注意两点:
其余的操作都是以指针的形式来进行操作,而这些操作就要用到指针的运算了,下面我们讨论重点内容:指针运算。
指针的运算
指针的运算包括指针与常数的加减,数组内的指针之间的减运算等。
指针与常数的加减:这个要注意指针的类型,指针变量加1,指针所指向的地址就增加一个类型的大小。如:一个int型指针p,p+1就是p指向的地址往后移动一个int型的大小,也就是4个字节。如果p指向的地址是0x00,那么p+1指向的地址就是0x04。同样,如果类型是是一个结构体,那么也是往后移动一个结构体的大小。
指针与指针的减:这样的操作一般是在数组,结构体等具有连续地址的空间里面进行运算的。假如有int arr[10];那么arr[5] - arr[3] 就等于2,意思就是相差两个int 空间的大小,当然,两个指针相加没有任何意义,就如同两个不相干的指针相减一样。