第八章——善于利用指针(二)——数组指针

原创
2020/12/22 20:21
阅读数 205

章节结构

  • 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=ap=&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]

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部