采用函数方法将a数组中5个整数按相反顺序存放
#include<stdio.h>
void inv(int*x,int n);
int main()
{
int i,arr[5],*p=arr;
printf("The original arry:\n");
for(i=0;i<5;i++,p++)
scanf("%d",p);
printf("Output:\n");
//p=arr;
inv(p,5);
printf("The array has been inverted:\n");
for(p=arr;p<arr+5;p++)
printf("%d ",*p);
printf("\n");
return 0;
}
void inv(intx,int n)
{
int i,tmp;
for(i=0;i<n/2;i++)
{
tmp=(x+i);
(x+i)=(x+n-i-1);
*(x+n-i-1)=tmp;
}
}
其中注释的p=arr是什么意思?没有为什么不行呢?这句与for循环中的p=arr有什么区别?麻烦将除了函数交换部分的整个程序讲解一下,尤其是通过指针变量传递数值的部分,谢谢
p=arr是让p指向arr数组的首地址
因为for(i=0;i<5;i++,p++)这里p++导致p的地址改变了,所以在for(p=arr;p<arr+5;p++)中,需要让p重新指向arr的首地址
代码注释如下:
#include<stdio.h>
void inv(int* x, int n);
int main()
{
int i, arr[5], * p = arr; //这里让p指向arr数组的首地址
printf("The original arry:\n");
for (i = 0; i < 5; i++, p++) //这里通过p向arr数组中读入数据,p最后指向arr数组的最后一个元素的下一个地址(最后一个元素是arr[4],p指向了arr[4]后面的一个地址)
scanf("%d", p);
printf("Output:\n");
//p=arr; //因为在上面的for循环中,p已经移动到了arr数组的末尾,所以,这里需要让p重新指向arr数组的首地址,否则在inv中就会越界,所以这一句不能少
inv(p, 5);
printf("The array has been inverted:\n");
for (p = arr; p < arr + 5; p++) //这里重新让p指向arr数组的首地址,并通过p输出arr数组的5个元素
printf("%d ", *p);
printf("\n");
return 0;
}
void inv(int* x, int n)
{
int i, tmp;
for (i = 0; i < n / 2; i++)
{
tmp = *(x + i);
*(x + i) = *(x + n - i - 1);
*(x + n - i - 1) = tmp;
}
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!