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

章节结构

  • 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
code

自加运算,如++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]

相关文章
相关标签/搜索