指针法访问数组
首先,通过一个小程序来初步窥探数组的实质:
#include <stdio.h>
#include <stdlib.h>
/*
这个程序用于测试数组的实质
*/
#define n 5
int main()
{
int a[n]={123,5,9,11,33};
printf("%d\n",a);//如果直接输出数组名字所代表的值
printf("%x\n",a);//如果用16进制输出数组名字所代表的值
printf("%x\n",&a[0]);//如果用16进制输出数组第一个元素的地址
printf("%d\n",a[0]);
printf("%d\n",*a);//如果对数组的名字使用取指针运算。。
return 0;
}
结果:
解析:
1.当输出数组名所代表的值时,发现输出的不是数组内所有的元素,甚至不是数组内任何一个元素。
2.用十六进制输出数组名所代表的值和数组第一个元素的地址值,发现他们是相同的。
3.对数组名使用取指针运算,得到的结果就是数组第一个元素的值。
4.综上所述,可以得出结论:数组名代表的是数组第一个元素的地址值。
数组和指针
已知:数组名代表数组的起始地址(数组首元素的地址)。
因此:
当 int a[10],*p;
p=&a[0];等价于p=a;
由此,进行以下测试:
代码示例:
#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试数组的本质
核心:数组的本质是在内存空间中定义一段连续的存储单元,数组名等同于指向数组首元素的指针
*/
int main()
{
int a[10]={1,3,5,7,9,11,13,15,17,19},*p,i;//定义一个整型的数组和指针
p=a;//使得指针指向数组中第一个元素的地址
/*用传统的方式输出数组中的元素*/
printf("output1:\t");
for(i=0;i<10;i++)
printf("%d ",a[i]);
/*因为p是数组中第一个元素的地址,所以。。*/
printf("\noutput2:\t");
for(i=0;i<10;i++)
printf("%d ",*(p+i));
/*因为a也是数组中第一个元素的地址,所以。。*/
printf("\noutput3:\t");
for(i=0;i<10;i++)
printf("%d ",*(a+i));
/*更激进的尝试。。。*/
printf("\noutput:4\t");
for(i=0;i<10;i++)
printf("%d ",p[i]);
return 0;
}
结果:
解析:
1.p+1代表的是p加一个内存单元的值,如果p代表数组第一个元素的地址,那么p+1代表的就是数组第二个元素的地址。
2.验证得出,以上4中方法都能输出数组中的值。
3. [ ] 这种形式的常用于数组之后的符号,其实是一种运算符。
注1:
优先级 | 运算符 | 功能 | 结合方式 |
1 | [ ] | 数组 | 由左向右 |
该运算符的运算实质:
1.按(a+i*d)计算