c语言指针变量访问数组元素,C语言数组指针(指向数组的指针)

C语言代码清单 1:显示数组元素的地址(指向元素的指针)

#include

#include

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

b0ec1d1cc764643f7ed92584ced7b2b5.gif

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值