八、善于利用指针——通过指针引用数组

1、数组元素的指针

一个变量有地址,一个数组包含若干个元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元素的地址。
引用数组元素可以用下表法,也可以用指针法,即使用数组元素的指针来找到所需的元素。使用指针法能使目标程序质量高(占内存少,运行速度快)。
在C语言中,数组名(不包括形参数组名)代表数组中首元素的地址。p=&a[0];与p=a;等价
程序中的数组名不代表整个数组,只代表数组首元素的地址。上述p=a;的作用是“把a数组的首元素的地址赋给指针变量p”,而不是把数组a各元素的值赋给p
在定义指针变量时可以对它初始化,如:int *p=&a[0];或者int *p=a;

2、在引用数组元素时指针的运算

在引用数组元素时常常会遇到指针的算数运算。有人会提出问题:对数值型数据进行算术运算的目的和含义是清楚的,而在什么情况下需要用到对指针型数据的算术运算呢?其含义是什么?
前已反复说明指针就是地址。
对地址进行赋值运算是没有问题的,但是对地址进行算数运算是什么意思呢?
显然对地址的乘和除的运算是没有意义的,实际上也无此必要。
那么,能否进行加和减的运算?
在一定的条件下允许对指针进行加和减的运算。
那么在什么情况下需要而且可以对指针进行加和减的运算呢?
当指针指向数组元素的时候。譬如,指针变量p指向数组元素a[0],我们希望用p+1表示指向下一个元素a[1]。如果能实现这样的运算,就会对引用数组元素提供很大的帮助。
在指针变量已经指向一个数组元素时,可以可以进行p+1、p-1、p++、++p、p–、–p、p1-p2(只有p1、p2都指向同一数组中的元素时才有意义)。
如果指针变量p已经指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。
注意:
a. 执行p+1并不是将p的值(地址)简单地加1,而是加上一个数组元素所占用的字节数。p+1所代表的地址实际上是p+1xd,d是一个数组元素所占的字节数。若p的值是2000,则p+1的值不是2001,而是2004
b. 如果p的初值为&a[0],则p+i和a+i就是数组元素a[i]的地址。这里需要注意的是,a代表数组首元素的地址,a+1代也是地址,它的计算方法同p+1,即它的实际地址为a+1xd
c. (p+i)或(a+i)是p+i或a+i所指向的数组元素a[i].
d. [ ]实际上是变址运算符,即将按a+i计算地址,然后找出地址单元的值。
e. 如果指针变量p1和p2都指向同一数组中的元素,如执行p2-p1,结果是p2-p1的值(两个地址之差)除以数组元素的长度,意义是p2所指向的元素与p1所指向的元素之间差几个元素。(两个地址不能加,没有意义)

3、通过指针引用数组元素

  1. 下标法
  2. 指针法 (a+1)或 (p+1)
    注意:
    a. 可以通过改变指针变量的值指向不同的元素。
    b. 要注意指针变量的当前值。
    c. 在使用指针变量指向数组元素时,应切实保证指向数组中的有效元素。利用指针使用数组元素,比较灵活多变,有不少的技巧。
    d. p++,由于和++同优先级,结合方向为自右向左,因此等价为
    (p++),意为先引用p的值实现
    p的运算,然后再使p自增1。p–等价为(p–)
    e. (++p),先使p加1,再取p;(–p),先使p减1,再取p;
    f. ++(*p),表示p所指的元素值加1;–(*p),表示p所指的元素值减1

4、用数组名作函数参数

当用数组名作参数时,如果形参数组中各元素的值发生了变化,实参数组元素的值随之变化。
C语言调用函数虚实结合的方法都是采用“值传递”方式,当用变量名作为函数参数时传递的是变量的值,当用数组名作为函数参数时,由于数组名代表的是数组首地址,因此传递的值是地址,所以要求形参为指针变量。
实参数组名代表的是一个固定的地址,或者说是指针常量,但形参数组名并不是一个固定的地址,而是按指针变量处理的。在函数调用进行虚实结合后,形参的值就是实参数组首元素的地址,在函数执行期间,它可以再被赋值。形参数组名实际上是一个指针变量,并不是要开辟相应的存储空间。函数调用期间,形参数组和实参数组共用同一段内存。
如果用指针变量作实参,必须先使指针变量有确定值,指向一个已定义的对象。

5、通过指针引用多维数组

猜你喜欢

转载自blog.csdn.net/lijiahao1212/article/details/129981803