数组元素的指针就是数组元素的地址。C语言中,数组名代表数组中首元素的地址,因此p=&a[0]等价于p=a,即把数组a的首元素的地址赋给指针变量p。
在指针指向数组时,可以对指针进行运算:
加一个整数:p+1;//指向同一数组的下一个元素
减一个整数:p-1;//指向同一个数组的上一个元素
自加运算:p++,++p; 自减运算:p--,--p;
两个指针相减:p1-p2;(当p1和p2指向同一数组元素时)//计算p1和p2所指元素的相对距离
例1:利用指针,输出数组中的全部元素。
1 int main() 2 { 3 int a[10]; 4 int *p,i; 5 printf("please enter 10 integer numbers: "); 6 for(i=0;i<10;i++) 7 { 8 scanf("%d",&a[i]); 9 } 10 for(p=a;p<(a+10);p++) 11 { 12 printf("%d,",*p); 13 } 14 printf(" "); 15 return 0; 16 }
1 int main() 2 { 3 int i,a[10],*p=a; 4 printf("please enter 10 integer numbers: "); 5 for(i=0;i<10;i++) 6 scanf("%d",p++); 7 p=a; 8 for(i=0;i<10;i++,p++) 9 printf("%d, ",*p); 10 printf(" "); 11 return 0; 12 }
两种方式,体现指针使用的灵活多样,我个人感觉这也是指针之所以难理解的原因。
例2:将数组a中n个整数按相反顺序存放。
1 int main() 2 { 3 void inv(int x[],int n); 4 int i,a[10]={21,3,56,25,5,7,33,78,2,9}; 5 printf("The original array: "); 6 for(i=0;i<10;i++) 7 printf("%d ",a[i]); 8 printf(" "); 9 inv(a,10); 10 printf("The array has been inverted: "); 11 for(i=0;i<10;i++) 12 printf("%d ",a[i]); 13 printf(" "); 14 return 0; 15 } 16 void inv(int x[],int n) 17 { 18 int temp,i,j,m=(n-1)/2; 19 for(i=0;i<=m;i++) 20 { 21 j=n-1-i; 22 temp=x[i]; 23 x[i]=x[j]; 24 x[j]=temp; 25 } 26 return; 27 }