如果我们写 p = &number[0];那么指针 p 就指向了 number 的第 0 号元素,也就是把number[0]的地址赋值给了 p,同理,如果写 p = &number[1];p 就指向了数组 number 的第 1号元素。p = &number[x];其中 x 的取值范围是 0~9,就表示 p 指向了数组 number 的第 x 号元素。指针本身,也可以进行几种简单的运算,这几种运算对于数组元素的指针来说应用最多。
1. 比较运算。比较的前提是两个指针指向同种类型的对象,比如两个指针变量 p 和 q它们指向了具有同种数据类型的数组,那它们可以进行 <,>,>=,<=,==等关系运算。如果 p==q 为真的话,表示这两个指针指向的是同一个元素。
2. 指针和整数可以直接进行加减运算。比如还是上边我们那个指针 p 和数组 number,如果 p = &number[0],那么 p+1 就指向了 number[1],p+9 就指向了 number[9]。当然了,如果 p = &number[9],p-9 也就指向了 number[0]。
3. 两个指针变量在一定条件下可以进行减法运算。如 p = &number[0]; q = &number[9];那么 q-p 的结果就是 9。但是这个地方大家要特别注意,这个 9 代表的是元素的个数,而不是真正的地址差值。如果我们的 number 的变量类型是 unsigned int 型,占 2 个字节,q-p 的结果依然是 9,因为它代表的是数组元素的个数。
在数组元素指针这里还有一种情况,就是数组名字其实就代表了数组元素的首地址,也就是说:
view plaincopy to clipboardprint?
p = &number[0];
p = number;
这两种表达方式是等价的,因此以下几种表达形式和内容需要大家格外注意一下。
根据指针的运算规则,p+x 代表的是 number[x]的地址,那么 number+x 代表的也是number[x]的地址。或者说,它们指向的都是 number 数组的第 x 号元素。
二维数组元素的指针和一维数组类似,需要介绍的内容不多。假如现在一个指针变量 p和一个二维数组 number[3][4],它的地址的表达方式也就是 p=&number[0][0],有一个地方要注意,既然数组名代表了数组元素的首地址,那么也就是说 p 和 number 都是指数组的首地址。对二维数组来说,number[0],number[1],number[2]都可以看成是一维数组的数组名字,所以 number[0]等价于 &number[0][0], number[1]等价于 &number[1][0], number[2]等价于&number[2][0]。加减运算和一维数组是类似的,不再详述。
指向数组元素指针的实例
在 C 语言里边,sizeof()可以用来获取括号内的对象所占用的内存字节数,虽然它写作函数的形式,但它并不是一个函数,而是 C 语言的一个关键字,sizeof()整体在程序代码中就相当于一个常量,也就是说这个获取操作是在程序编译的时候进行的,而不是在程序运行的时候进行。这是一个实际编程中很有用的关键字,灵活运用它可以为程序带来更好的可读性、易维护性和可移植性,在后续的例程学习中将会慢慢有所体会的。