章节结构
- 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的值(地址)简单加1code
自加运算,如++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)处理的,即按数组首元素的地址加上相对位移量获得要找的元素的地址,而后找出该单元中的内容。class
[]实际上变址运算符,即将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]