32 通过指针引用数组
点击蓝字
关注我们
DRAGON BOAT FESTIVAL
01 数组元素的指针
指针变量既可以指向变量,也可以指向数组元素。所谓数组元素的指针就是数组元素的地址。
引用数组元素可以用下标法,也可以用指针法,即通过指向数组元素的指针找到所需的元素。
使用指针法能使目标程序质量高(占内存少,运行速度快)。
在C语言中,数组名(不包括形参数组名,形参数组并不占据实际的内存单元)代表数组中首元素的地址。
02 在引用数组元素时指针的运算
在一定条件下允许对指针进行加和减的运算。
当指针指向数组元素时,譬如,指针变量p指向数组元素a[0],我们希望用p+1表示指向下一个元素a[1]。
在指针指向数组元素时,可以对指针进行以下运算:
(1)加一个整数,如p+1。
(2)减一个整数,如p-1。
(3)自加运算,如p++,++p。
(4)自减运算,如p--,--p。
(5)两个指针相减,如p1-p2(只有p1和p2都指向同一数组中的元素时才有意义)。
在 C 语言中,指针变量加 1 表示跳过该指针变量对应的基类型所占字节数大小的空间。指向数组元素的指针,其基类型为数组元素类型,指针加 1 表示跳过一个数组元素空间,指向下一个数组元素。
例如:
int *p,a[10];
p=a; //相当于 p=&a[0];
说明:数组名 a 相当于数组首元素 a[0] 的地址,即 a 等价于 &a[0]。
上述语句定义了整型指针变量 p 和整型数组 a,并使 p 初始指向数组首元素 a[0]。
03 通过指针引用数组元素
当指针变量和数组元素建立联系后,可通过以下方式访问数组元素。
1. 间接访问:*(数组名+i); 的形式。其中,i 为整数,其范围为:0<i<N,N 为数组大小。数组名 a 为首元素的地址,是地址常量,a+i 表示跳过 i 个数据元素的存储空间,即(a+i)表示 a[i] 元素的地址,从而 *(a+i) 表示 a[i]。
如果指针变量 p 被初始化为 a 之后,不再改变,那么也可以使用 *(p + i) 的形式访问 a[i],不过这样就失去了使用指针变量访问数组元素的意义。
2.间接访问:*(指针变量);的形式。当执行语句 p=a; 后,可以通过改变 p 自身的值(可通过自增、自减运算),从而使得 p 中保存不同的数组元素的地址,进而通过 *p 访问该数组中不同的元素。这是使用指针访问数组元素较常用的形式。例如,如下代码通过使用指针变量的移动来遍历输出数组中的每个元素。
for (p=a;p<a+N;p++) //用p的移动范围控制循环次数
printf ("%d\t",*p);
确定 p 指针移动的起止地址,即循环控制表达式的确定是使用指针访问数组元素的关键。
p 初始指向 a[0],即 p=&a[0]; 或 p=a;。
p 终止指向 a[N-1],即 p=&a[N-l]; 或 p=a+N-1;。
故可得 p 的移动范围为:p>=a && p<=a+N-1;,而 p<=a+N-1 通常写成 p<a+N;,由此可得循环条件为:for (p=a;p<a+N;p++)。
04 用数组名作函数参数
C语言调用函数时虚实结合的方法都是采用“值传递”方式,当用变量名作为函数参数时传递的是变量的值,当用数组名作为函数参数时。
由于数组名代表的是数组元素地址,因此传递的值是地址,所以要去形参为指针变量。
实参数组名代表一个固定的地址,或者说是指针变量,但形参数组名并不是一个固定的地址,而是按指针变量处理。
05 通过指针引用多维数组
多维数组元素的地址
(1)性质与二维数组差不多,但需要注意的是,多维数组由于分配内存情况不同,所显示的地址可能是不同的。
指向多维数组元素的指针变量
(1)指向数组元素的指针变量。
(2)指向由m个元素组成的一维数组的指针变量。
用指向数组的指针作函数参数
(1)一维数组名可以作为函数参数,多维数组名也可以作函数参数。
(2)用指针变量作形参,以接收实参数组名传递来的地址,有两个方法:
①用指向变量的指针变量。
②用指向一维数组的指针变量。
球分享
球点赞
球在看