一个变量有地址,一个数组包含若干个元素,每个数组元素都在内存中占用存储单元,他们都有响应的地址。既然指针可以指向变量,也就意味着它也可以指向数组元素,即把某个元素的地址放到一个指针变量中。所以所谓数组元素的指针就是数组元素的地址。定义一个有10个元素的整形数组,int a[10];定义一个指向整形变量的指针变量,int *p;若p=&a[0]或p=a;则代表将a[0]元素的地址赋给了指针变量p。其中值得注意的是a代表的不是整个数组,而是带表数组名,C中规定数组名代表把数组中第一个元素的地址,因此a等同与&a[0];只是形式上的不同而已。在明白了基础概念之后,我们进一不看看数组名和指向数组的指针变量的应用。
将数组名作为函数参数的时候,在实参和形参之间的对应关系有以下四种:
1.形参和实参都用数组名,如
main() f(int x[].int n)
{int a[10]; {
…… ……
f(a,10); }
}由于形参数组名接受了实参数组首元素的地址,因此在函数调用期间,形参数组与实参数组共用一段内存空间。
2.实参用数组名,形参用指针变量,如
main() f(int *x,int n)
{int a[10]; {
…… ……
f(a,10); }
}x为指向整形变量的指针变量,函数开始执行是x指向a[0],通过x值的变化,可以指向a数组的任一元素。
3.实参形参都用指针变量,如
main() f(int *x,int n)
{int a[10]; ,*p; {
p=a; …… ……
f(p,10); }
}实参p和形参x都是指针变量,p先指向数组a,即p的值就是&a[0],然后将p的值传递给x,x的值也是&a[0],因此通过x的改变就可使x指向a的任一元素。
4.实参为指针变量,形参为数组名,如
main() f(int x[],int n)
{int a[10],*p; {
p=a;…… ……
f(p,10); }
}实参p为指针变量,它指向a[0],形参为数组名x,但在C中将它做为指针变量来处理,所以a[0]的值也传给了x,因此也可以理解为形参数组x和a数组共用同一段内存单元。