所谓数组元素的指针就是数组元的地址
1. 指针如何引用数组
int a[10] = {1,3,5,7,9,11,13,15,17,19};
int * p;
p = &a[0];
其中数组名 "a" 不代表整个数组,只代表数组首元素的地址。
p = &a[0] 等价于 p = a;
2. 在引用数组元素时指针的运算
当指针指针指向数组元素的时候
可以 p+1 表示指向下一个元素a[1]
如
- p+1
- p-1
- p++,++p;
- p–,--p
但两个指针相减,如p1-p2(只有p1和p2都指向同一个数组中的元素时才有意义
如果p1和p2都指向同一个数组中的元素时,如执行p2-p1,结果是p2-p1的值(两个地址之差)除以数组元素的长度。例如 p2 = &a[5] = 2020,p1 = &a[3] =2012,p2-p1=
(2020-2012)/4 = 2所以就得到两个数组之间差2个元素
这样我们就不需要具体p1和p2的值就可以不用知道两个元素的具体值,而是直接用p2-p1就可知道它们所指元素的相对距离。
另外 地址进行乘、除和相加的运算是没有意义的
3. 通过指针引用数组元素
- 下标法 如a[i]
- 指针法 如 *(a+i)
但是其中要注意的是
1。 指针变量的当前值。例如 p = a[5],指针的当前值就是 a[5]的地址
2。如果把 ++i改为 ++a 是不行的
因为数组名a代表数组首元素的地址,它是一个指针型常量,它的值在程序运行期间是固定不变的。既然a是常量,所以a++,++a是无法实现的。
4. 指针的指向
在这个程序中指针变量p指向某一数组元素,但是实际上指针变量p可以指向数组以后的存储单元。
对p[i]处理成*(p+i),如果指向一个整型数组元素a[0],则p[i]代表a[i]。但是必须注意p的当前值是什么?这个程序如果在输出*p时不把a[0]的地址重新赋值给p的话,此时的p是指向a[9]的,如果进行p++的话 会是一些不知道的数字。
-
p++
*p; 这个是指向下一元素a[1] -
*p++ = *(p++)
由于++和 " * "同级关系 结合方向自右而左 -
6*(++p)不等价于*(++p)
-
++(*p)
表示p所指向的元素值加1
5.用数组名作函数参数
例如
fun(int *arr,int n) = fun(int arr[],int n)
*(arr+i) = arr[i]
实参类型 | 变量名 | 数组名 |
---|---|---|
要求形参的类型 | 变量名 | 数组名或指针变量 |
传递的信息 | 变量的值 | 实参数组元素的地址 |
通过函数调用能否改变实参的值 | 不能改变实参变量的值 | 能改变实参数组的值 |
注意
实参数组名代表一个固定的地址,或者说是指针常量,但形参数组名并不是一个固定的地址,而是按指针变量处理。
最后分析一个简单的案例