int a[10]={1,3,4,5,6,8,9,0,32,23};
int *p;
p=&a[0];//int *p=&a[0]//int *p=a;
指针指向数组元素时,可以进行加减运算
当两个指针相减,如p1-p2(只有它们都指向同一数组中的元素时才有意义)
p+1指向同一数组种的下一个元素,p-1则是上一个(加一是加上数组元素所占用的字节数)
*(p+5), * (a+5)和a[5]等价
(3)用指针变量指向数组元素
#include<stdio.h>
int main()
{
int a[10];
int *p,i;
printf("please input ten numbers:");
for(p=a;p<(a+10);p++)
{scanf_s("%d",p;}
for(p=a;p<(a+10);p++)
printf("%d",*p);
printf("\n");
system("pause");
return 0;
}
当用数组名作为参数时,如果形参数组中各元素的值发生变化,实参数组元素的值随之变化。
C编译都是将形参数组名作为指针变量来处理的。
例8.8 将数组a中n个整数按相反顺序存放。
#include<stdio.h>
int main()
{
void inv(int x[],int n);
int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf("The original array :\n");
for(i=0;i<10;i++)
printf("%d",a[i]);
printf("\n");
inv(a,10);
printf("The array has been inverted :\n");
for(i=0;i<10;i++)
printf("%d",a[i]);
printf("\n");
system("pause");
return 0;
}
void inv(int x[],int n)
{
int i,temp;
for(i=0;i<n/2;i++)
{
temp=x[i];
x[i]=x[n-i];//Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.错误说明我a越界了,很明显我出现了一个x[10];
x[n-i]=temp;
}
}
//下面这个void是对的
void inv(int x[], int n)
{
int i, temp,j=(n-1)/2;
for (i = 0; i<=j; i++)
{
temp = x[i];
x[i] = x[n-1-i];
x[n -1- i] = temp;
}
}
因为形参数组名实际上是一个指针变量,并不是真正的开辟一个数组空间(定义是参数组时必须指定数组大小,因为要开辟相应的存储空间)
void inv(int *x,int n)
{
int *p,temp,*i,*j,m=(n-1)/2;
i=x;j=x+n-1;p=x+m;
for(;i<=p;i++,j--)
{
temp=*i;*i=*j;*j=temp;
}
return;
}