一、指针引用数组
1、基本概念
● 数组的指针是指数组的首地址。
● 数组元素的指针是指数组元素的地址。因此,同样可以用指针变量来指向数组或数组元素。
● 在C语言中,由于数组名代表数组的首地址,因此,数组名实际上也是指针。
例如:可以用一个指针变量指向一个数组元素。
int a[10]; (定义a为包含10个整型数据的数组)
int *p; (定义p为指向整型变量的指针变量)
p=&a[0]; (把a[0]元素的地址赋给指针变量p)
也就是使p指向a数组下标为0的元素(第一个元素) 。
2、指针的运算
在指针指向数组元素时,可以对指针进行以下运算:
加一个整数(用+或+=),如p+1
减一个整数(用-或-=),如p-1
自加运算,如p++,++p
自减运算,如p--,--p
两个指针相减,如p1-p2 (只有p1和p2都指向同一数组中的元素时才有意义)。
分别说明如下:
⑴ 如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的 下一个元素,p-1指向同一数组中的上一个元素。即p+1或p-1也表示地址。但要注意的是,虽然指针变量p中存放的是地址,但p+1并不表示该地址加1,而表示在原地址的基础上加了该数据类型所占的字节数d
⑵ 如果p原来指向a[0],执行++p后p的值改变了,在p的原值基础上加d,这样p就指向数组的下一个元素a[1]。d是数组元素占的字节数。
⑶ 如果p的初值为&a[0]则p+i 和a+i 就是数组元素a[i]的地址,或者说,它们指向a数组的第 i 个元素 。
⑷ *(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。
⑸ 如果指针变量p1和p2都指向同一数组,如执行p2-p1,结果是两个地址之差除以数组元素的长度d。
3、指针引用数组元素
⑴ 下标法,如a[i] 形式;
⑵ 指针法,如*(a+i)或*(p+i)。其中a是数组名,p是指向数组元素的指针变量,其初值p=a。
使用指针变量指向数组元素时,注意以下几个问题:
⑴ 可以通过改变指针变量p的值来指向不同的元素。p++使p指向不同的元素,而a++是无法实现的,因为a是数组的首地址,是常量。
⑵ 要注意指针变量的当前值。
⑶ 使用指针变量指向数组元素时,应切实保证指向有效的元素,注意不要越界(超过最大元素),越界系统不提示。
⑷ 指向数组的指针变量也可以带下标,如p[i]。若p=&a[0],则p[i]、*(p+i) 代表a[i]。
⑸ ① p++;*p; 先使p指向下一元素,然后再取其值;
② *p++ 相当于 *(p++),即先求*p,再作p++
③ *(++p) 先使p++ ,再取*p
④ (*p)++ 使所指向的元素值加1,而不是指针值加1
⑤ 若p指向a数组中第i个元素,则:*(p--) 相当于a[i--],先*p,再p--
*(++p)相当于a[++i],先p++,再*
*(--p)相当于a[--i],先p--,再*
4、数组名作函数参数
如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下4种情况:
(1)形参和实参都用数组名
(2)实参用数组名,形参用指针变量
(3)实参形参都用指针变量
(4)实参为指针变量,形参为数组名
5、指针引用多维数组
指针变量可以指向一维数组元素,也可以指向多维数组元素。