首页 > C语言教程 > C语言指针 阅读数:19

C语言数组指针(指向数组的指针)

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]。

数组名及指向数组的指针
图 1:数组名及指向数组的指针

指针变量 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]。

总结:数组名就是一个指针,而且它指向该数组的第一个元素。