一、所谓数组元素的指针就是数组元素的地址。
通过前边的学习我们已经了解到了什么是指针,已经指针的用法。
指针与地址是紧密联系的。我认为一般情况下,取地址&与指针*是反函数的关系。即他两个同事出现在一段代码中时,可以相互抵消。
&p[]:将p数组的收尾地址即p[0]的地址位置表示出来。
*p[]:将p数组的首元素地址的值表示出来。
二、在引用数组元素时指针的运算
在指针指向一个数组元素时,可以进行一下运算:
加一个整数:p++;p--;
两个指针相减,比如p1-p2(只有他两个指向同一个数组的元素中才有意义)
在我们定义一个数组时,一定会对他的数组类型进行说明,比如:int、float等,不同的字符类型,他们所占有的字节是不同的。这样,我们在进行地址的查找时就会发现p+1的值是随着数组的类型而改变的。int型数组他的指针所查找的的地址就是在p[0]的地址的基础上加四。比如char型数组,他就是在原来的地址的基础上加一。
三、通过指针引用数组元素
(1)下标法:最常见的a[i];
(2)指针法:*(a+i)
其实上面两个表示方式所表示的数是相同的。
接着,我们对几个易混淆的概念进行分析
(1)p++使p指向下一个元素a[1].
*p一般指的是得到首元素地址的值。
(2)*p++由于p前后的两个符号的运算级是相同的,所以正常运算就可以先把首元素的值提出然后再加一即可。
(3)*(p++)与*p++是相同的,见上文。
*(++p)是先对p加一即对p的所代表的地址加上m*1,然后取值,其实得到的是p[1]的值。
四、用数组名作函数参数
int main()
{void fun(int arr[],int n);
int array[10];
fun(array,10);
return 0;
}
void fun(int arr[],int n)
{
}
在这里面array是实参数组名,arr是形参数组名。前边已经说过下标法与指针法虽然表示的形式不同但是所表达的意思是一样的。
所以void fun(int arr[],int n)可以写成void fun(int *arr,int n),他们两个所表达的意思是一样的。
| 实参类型 | 变量名 | 数组名 |
| 要求形参的类型 | 变量名 | 数组名或变量指针 |
| 传递的信息 | 变量的值 | 实参数组首元素的地址 |
| 通过函数调用是否能改变实参的值 | 不能 | 能 |
需要注意的是,实参的数组名代表一个固定的地址,或者说指针常量,但是形参数组名不是一个固定的地址,而是按指针变量处理。






