C语言代码清单 1:显示数组元素的地址(指向元素的指针)
#include <stdio.h>
#include <stdlib.h>
int main( )
{
system("color 70");
int i;
int a[5]={1,2,3,4,5};
int *p = a; //指针p指向a[0]
printf("指向各元素的指针的表达式及值:\n");
printf(" a = %p p = %p\n",a,p);
for(i=0;i<5;i++)
{
printf(" &a[%d] = %p a+%d = %p ",i,&a[i],i,a+i);
printf("&p[%d] = %p p+%d = %p\n",i,&p[i],i,p+i);
}
printf("\n各元素的表达式及值:\n");
printf(" *a = %d *p = %d\n",*a,*p);
for(i=0;i<5;i++)
{
printf(" a[%d] = %d *(a+%d) = %d ",i,a[i],i,*(a+i));
printf("p[%d] = %d *(p+%d) = %d\n",i,p[i],i,*(p+i));
}
printf("\n\n");
system("pause");
return 0;
}
运行结果为:
指向各元素的指针的表达式及值:
a = 0060FEE4 p = 0060FEE4
&a[0] = 0060FEE4 a+0 = 0060FEE4 &p[0] = 0060FEE4 p+0 = 0060FEE4
&a[1] = 0060FEE8 a+1 = 0060FEE8 &p[1] = 0060FEE8 p+1 = 0060FEE8
&a[2] = 0060FEEC a+2 = 0060FEEC &p[2] = 0060FEEC p+2 = 0060FEEC
&a[3] = 0060FEF0 a+3 = 0060FEF0 &p[3] = 0060FEF0 p+3 = 0060FEF0
&a[4] = 0060FEF4 a+4 = 0060FEF4 &p[4] = 0060FEF4 p+4 = 0060FEF4
各元素的表达式及值:
*a = 1 *p = 1
a[0] = 1 *(a+0) = 1 p[0] = 1 *(p+0) = 1
a[1] = 2 *(a+1) = 2 p[1] = 2 *(p+1) = 2
a[2] = 3 *(a+2) = 3 p[2] = 3 *(p+2) = 3
a[3] = 4 *(a+3) = 4 p[3] = 4 *(p+3) = 4
a[4] = 5 *(a+4) = 5 p[4] = 5 *(p+4) = 5
在代码清单 1 的程序中,我们用printf("a=%p p=%p\n",a,p);显示指针 p 和数组名 a 的值后发现两者的显示结果都是 0060FEE4(数组元素 a[0] 的内存地址)。之所以会有这样的结果,是因为 C语言中的数组名实际上就是一个指针,而且它指向该数组的第一个元素(见图 1a) ),即代表数组名的变量 a 里面存放的是第一个数组元素的内存地址。
如果定义一个指针 p,并将其指向数组 a,即int*p=a;,则这个指针 p 的行为就像数组 a 本身一样(见图 1b) ),即在访问数组 a 的过程中,所有的数组名 a 都可以用 p 代替:a[i]、*(a+i)、p[i]、*(p+i) 这 4 个表达式都表示相同的第 i 个数组元素。
指针 p 和 a 都指向数组的第一个元素 a[0],则:p+1 和 a+1指向数组元素 a[1];p+2 和 a+2 指向数组元素 a[2];依次类推,p+i 和 a+i 都指向数组元素 a[i]。
指针变量 p 和 a 中都存放的是数组第一个元素 a[0] 的地址 &a[0],则:p+1 和 a+1 中都存放的是数组元素 a[1] 的地址 &a[1];p+2 和 a+2 中都存放的是数组元素 a[2] 的地址 &a[2];依次类推,p+i 和 a+i 中都存放的是数组元素 a[i] 的地址 &a[i]。
.
由此可知:&a[i]、a+i、&p[i]、p+i 这 4 个表达式的值都是数组元素 a[i] 在内存中的地址 &a[i]。
总结:数组名就是一个指针,而且它指向该数组的第一个元素。