#include<stdio.h>
void inv(int * a,int n);
int main()
{
int i;
int a[10]={1,2,3,4,5,6,7,8,9,10};
inv(a,10);
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
void inv(int * a,int n)
{
int * i,* j,* m;
int temp;
i=a;
j=a+n-1;
m=a+(n-1)/2;
for(;i<=m;i++,j--)
{temp = * i;* i = * j;* j = temp;}
}
以上是正确代码,在此基础上标注易错点
错误1:野指针,未赋初始值
void inv(int * a,int n)
{
int * i,* j,* m;
int * temp;//指针未赋初始值,野指针
i=a;
j=a+n-1;
m=a+(n-1)/2;
for(;i<=m;i++,j--)
{* temp = * i;* i = * j;* j = * temp;}
/*就算对temp赋值,也没有权限读取temp所指的内存单元,故对*j赋值失败*/
}
错误2:int * 和int 混乱使用
void inv(int * a,int n)
{
int * i,* j;
int temp;
i=a;
j=a+n-1;
for(;i<=(n-1)/2;i++,j--)/*本意是i的变化在0-4,但int * 和int 无法比较,同时i是在a的基础上变化。所以i<=a+(n-1)/2就对了*/
{temp = * i;* i = * j;* j = temp;}
}
错误3:
不管主函数最后对数组a的输出,我们在inv函数中添加一个输出,犯的错误是没有管 i 的地址的变化想当然使用。
void inv(int * a,int n)
{
int * i,* j,* m;
int temp;
i=a;
j=a+n-1;
m=a+(n-1)/2;
for(;i<=m;i++,j--)//i=a+4后退出循环
{temp = * i;* i = * j;* j = temp;}
//以下是添加的一个输出
/*由于i已经加到i=a+4了,未重新指定i所指起始地址,i将会从上一个循环的i的最终值a+4继续这次循环,输出a+4到a+9的各元素后退出循环。在这次循环条件内再次赋值i=a即可。即for(i=a;i<a+n;i++)*/
for(;i<a+n;i++)
printf("%d ",*i);
}
用这个比较简单的例题来反馈这些问题,课本的例题还是挺好的,循循渐进。