章节结构
- 8.3 通过指针引用数组
- 8.3.1 数组元素的指针
- 8.3.2 在引用数组元素时指针的运算
- 8.3.3 通过指针引用数组元素
- 8.3.4 用数组名作函数参数(以及用数组名与变量名作为函数参数的比较)
- 8.3.5 通过指针引用多维数组
- 8.3.6 多维数组元素的地址
- 8.3.7 指向多维数组元素的指针变量
- 8.3.8 用指向数组的指针作函数参数
8.3.1 数组元素的指针
- 所谓数组元素的指针就是数组元素的地址
- 引用数组元素可以使用下标法,也可以用指针法
- 数组名就是数组的地址。数组首元素的地址也就是数组的地址
假设p为指向数组的指针,a为数组名则有:p=a
且p=&a[0]
程序中的数组名不代表整个数组,只代表数组首元素的地址,因此
int a[4] = { 1,3,4,5}; int * p; p = &a[0]; // p的值是a[0]的地址 p = a; // p的值是数组a首元素(即a[0]) 的地址
p = &a[0]
和p = a
等价
定义指针变量时可以同时对其初始化
int * p = &a[0];
等效于
int * p;
p = &a[0];
或
int * p;
p = a; // a为数组名
8.3.2 在引用数组元素时指针的运算(4点说明)
说明:下面p表示指针名,a表示数组名
- (1)在指针已指向一个数组元素时,就可以对指针进行以下运算
加一个整数(用+或+=),如p+1;(指向同一数组中的下一个元素)
减一个整数(用-或-=),如p-1;(指向同一数组中的上一个数组)
这里,给指针直接加1,
表示的是加上一个数组元素所占用的字节数,而不是将p的值(地址)简单加1
自加运算,如++p,p++;
自减运算,如--p,p--;
- (2)如果p的初值为&a[0],则p +i和a+i就是数组元素a[i]的地址,或者说,它们指向a数组序号为i的元素
- (3)*(p + i)或* (a + i)是p+i或a+i所指向的数组元素,即a[i]。
*(p+5)
,*(a+5)
和a[5]
等价
实际上,在编译时,对数组元素a[i]就是按*(a+i)处理的,即按数组首元素的地址加上相对位移量得到要找的元素的地址,然后找出该单元中的内容。
[]实际上变址运算符,即将a[i]按a+i计算地址,然后找出此地址单元中的值
- (4)如果指针变量p1和p2都指向同一数组中的元素,如执行
p1-p2
,结果是p2-p1
的值(两个地址之差)除以数组元素的长度。
- 两个指针相减,如p1 -p2(只有p1和p2都指向同一数组中的元素时才有意义,表示p1和p2之间相差多少元素)
- 两个地址不能相加,如
p1+p2
是无实际意义的。
8.3.3 通过指针引用数组元素
引用一个数组元素,可以有两种方法
- 下标法,如a[i]形式;
- 指针法,如
*(a+i)
或*(p+i)
,其中a是数组名,p是指向数组元素的指针变量
因此引用一个数组中各元素的值有三种方法
- 下标法,
a[3]
- 通过数组名计算数组元素地址,找出元素的值,
*(a+i)
- 用指针变量指向数组元素
*(p+i)
数组名是一个指针型常量,它的值在程序运行期间是固定不变的,因此无法实现
a++
*(p--)
*(++p)
8.3.4 用数组名作函数参数
如果用指针变量做实参,必须先使指针变量有确定值,指向一个已定义的对象。
数组名作函数参数。 实参数组名代表该数组首元素的地址,而形参是用来接收从实参传递过来的数组首元素地址的。 因此,形参应该是一个指针变量(只有指针变量才能存放地址)。实际上,C编译都是将形参数组名作为指针变量来处理的。
即void fun(int arr[],int n)
等价于void fun( int * arr,int n)
实参数组名代表一个固定的地址,或者说是指针常量,但形参数组名并不是一个固定的地址,而是按指针变量处理。
8.3.5 通过指针引用多维数组
(1)多维数组元素的地址 二维数组名是指向行(一维数组)的。
int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}};
(2) 指向多维数组元素的指针变量
- 指向数组元素的指针变量
int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}};
int * p;
p = a[0];
- 指向由m个元素组成的一维数组的指针变量
int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}};
int (*p)[4];// 指向一维数组的指针
p = a; // p指向二维数组的0行
(3)用指向数组的指针作函数参数 一维数组名可以作为函数参数,多维数组名也可作函数参数。
用指针变量作形参,以接受实参数组名传递来的地址。
可以有两种方法:(a)用指向变量的指针变量 * score
(b)用指向一维数组的指针变量 ·(* score)[4]