数组元素的指针就是数组元素的地址。
1、指向数组元素的指针
C语言规定数组名(不包括形参数组名,形参数组并不占据实际的内存单元)代表数组中的首元素(即序列为0的元素)的地址。
int a[10]; int *p1,*p2; p1 = &a[0]; p2 = a;
p1和p2指向同一个数组a[10]。
2、通过指针引用数组元素
按C语言的规定,如果指针变量p已指向数组中的一个元素,则p+1指向同一个数组中的下一个元素,而不是将p的值(地址)简单的加1。
如果p的初值为&a[0],则
(1) p+i 和 a+i就是a[i]的地址。
(2) *(p+i) 或 *(a+i)是p+i 和 a+i 所指向的数组元素,即a[i]。
(3)指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。
for(p=a;p<a+10;p++) printf("%d",*p);
(4)可以通过改变指针变量指向不同的元素。注意上面的p++不能改为a++,原因是数组a虽然也代表数组首元素的地址,但它是一个指针常量,它的值在程序运行期间是固定不变的。
(5)注意指针的指向。
#include <stdio.h> void main() { int *p,i,a[10]; p = a; for(i=0;i<10;i++) scanf("%d",p++); printf("\n"); p = a; //作用是将指针的位置重新定位到数组首地址处 for(i=0;i<10;i++,p++) { printf("%d",*p); printf("\n"); } return; }
(6)注意指针变量的运算
i.p++或(p+=1).使p指向下一元素,即a[1]。若再执行*p,则得到下一个元素a[1]的值。
ii.*p++。由于++和*同优先级,结合方向为自右向左,因此它等价于*(p++)。作用是先得到p指向的变量即(*p),然后再使p+1.
for(i=0;i<10;i++) printf("%d",*p++);
与(3)等价。
iii.*(p++)与*(++p)作用不同。前者是先取*p值,然后使p加1.后者是先使p+1,然后再取*p。若p初值为a(即&a[0]),则*(p++)为a[0],*(++p)为a[1]。
iv.++(*p)表示p所指向的元素值加1,如果p=a,则++(*p)相当于++(a[0]),注意是元素a[0]加1,不是指针p加1。
v.如果p当前指向a数组中第i个元素,则
*(p--)相当于a[i--],先对p进行*运算,再使p自减。
*(++p)相当于a[++i],先使p自加,再作*运算。
*(--p)相当于a[--i],先使p自减,再作*运算。
3、用数组名作为函数参数
实参数组名代表一个固定的地址,或者是指针常量,但形参数组并不是一个固定的地址值,而是作为指针变量,并不是真正地开辟一个数组空间,在函数调用开始时,它的值等于实参数组首元素的地址,在函数执行期间,它可以再被赋值。实参和形参都可以使用数组名或指针变量。
4、多维数组与指针
C语言基础学习3:数组与指针