[问题求助]函数指针问题!

bgu 2003-05-23 05:32:34
代码如下:
----------------------------------------
void inv(int * x,int n)
{
int temp;
for (;x<=x+4;x++)
{temp=*x;*x=(*(x+n-1))--;*(x+n-1)=temp;}
return;
}
main()
{
int i,a[10]={3,7,9,44,0,1,2,5,4,6};
for (i=0;i<=9;i++);
printf ("%d",&a[i]);
printf("\n");
inv(a,10);
for (i=0;i<=9;i++)
printf("%d",a[i]);
printf("\n");
}
---------------------------------------
这个是tc的程序,可以运行,并没有发生什么语法的错误,可以一运行就会弹出一个对话框,是一个msg对话框来的,说什么我也没记下来,只知道对话框里有两个选择,一个是关闭一个是忽略。
请问,到底是为什么?到底哪里出错了!!
...全文
14 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
THEBEST 2003-05-24
  • 打赏
  • 举报
回复
程序可读性太差了!

我觉得可读取很重要!

这一点每个程序员都必需重视!
bgu 2003-05-24
  • 打赏
  • 举报
回复
plainsong(伤心的风★短歌) 大哥!
上面两个我都理解。但第三个递归就不好理解!!!能解释一下不??
我的理解是:
第一次形参n=10时,x[n - 1]即等于x[9]但为什么用n-2??而不用n-1呢?当然,你的程序是没错的,n-1是不行的,我只是理解不了!我只想到,如果n-2的话,那当n=10时就是n-2=8了。那再递归的话那x[n-1]不就是成了x[7]了!那x[8]去哪了?
能解释下好不?
fxxxxk 2003-05-24
  • 打赏
  • 举报
回复
x<=x+4

疯了?????

你当这是vb呀?????
短歌如风 2003-05-24
  • 打赏
  • 举报
回复
你只看到了n-2,却没有看到x+1啊!
其实这几个方法实现是一样的,都是从两端向中间循环执行交换。
要是有兴趣的话,看一下这个贴子,里面还有一些其它实现方法(不过是反转字符串的,因为有一个结束符'\0',所以和你的问题不太一样):
http://expert.csdn.net/Expert/TopicView1.asp?id=1723684
bgu 2003-05-24
  • 打赏
  • 举报
回复
//--------------------------------
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;
}
main()
{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");
}
//----------------------------------------
这一段很差么?这个可是谭浩强书上原本原样的。
我只是看到他怎么用那么多的指针来写一个这样的一个小小算法程序,这不是浪费资源了!所以就想用最少的定义来写它。我喜欢把一道题目用多种算法来写!!

还是说回正题吧!n-2怎么解????
短歌如风 2003-05-23
  • 打赏
  • 举报
回复
如果只用一个指针可以改为:
void inv(int *x, int n)
{
int i, j, temp;
for (i = 0, j = n - 1; i < j; i ++, j --)
{
temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}

void inv(int *x, int n)
{
int i, temp;
for (i = 0; i < n / 2; i ++)
{
temp = x[i];
x[i] = x[n - 1 - i];
x[n - 1 - i] = temp;
}
}

void inv(int * x, int n)
{
int temp;
if (n > 1)
{
temp = *x;
*x = x[n - 1];
x[n - 1] = temp;
inv(x + 1, n - 2);
}
}
bgu 2003-05-23
  • 打赏
  • 举报
回复
嗯嗯嗯!!!
我明了!!!!!!
plainsong(伤心的风★短歌) 大哥谢谢!
短歌如风 2003-05-23
  • 打赏
  • 举报
回复
是不是这个意思:
void inv(int *x,int n)
{
int *y;
int temp;
for (y = x + n - 1; x < y; x ++, y --)
{
temp = *x;
*x = *y;
*y = temp;
}
}
bgu 2003-05-23
  • 打赏
  • 举报
回复
其实我只是写一个这样的程序:将数组a中的n个整数按相反的顺序存放。
这是源程序:
------------------------
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;
}
main()
{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");
}
------------------------------------
后来我改为在int函数里只用两个指针做出这个效果了也就是用*(x+n-1)把*j替换掉,程序如下:
------------------------------------
void inv(int *x,int n)
{
int temp,*i,m=5;
i=x;
for (;i<=x+m;i++,n--)
{temp=*i;*i=(*(x+n-1))--;*(x+n-1)=temp;}
return;
}
main()
{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");
}
---------------------------------------
再后来我又想如果只用一个指针可不可以实现?就把它改成了主题里的程序。没想到就出现了这样的事!!!!!
lbaby 2003-05-23
  • 打赏
  • 举报
回复
{temp=*x;*x=(*(x+n-1))--;*(x+n-1)=temp;}天,这是要干什么啊?
短歌如风 2003-05-23
  • 打赏
  • 举报
回复
你的代码中有很多问题,尤其是inv函数,我不知道你要作什么,只能从一般的角度去找错误了:
void inv(int * x,int n)
{
int temp;
for (;x<=x+4;x++)//这近乎于一个死循环(x<=x+4永远成立,直到发生溢出)。
{temp=*x;*x=(*(x+n-1))--;*(x+n-1)=temp;}//由于是死循环,这里将发生内存非法访问,这就是你看到的对话框的来源。
return;
}
main()
{
int i,a[10]={3,7,9,44,0,1,2,5,4,6};
for (i=0;i<=9;i++);//这是一个空循环,是不是多写一个分号?
printf ("%d",&a[i]);//由于前一条语句是空循环,这条语句只执行一次,并且这里i为10,有越界访问,不过不会产生非法访问,从而很难发现。为什么要输入地址呢?是不是应该是printf("%d",a[i])?
printf("\n");
inv(a,10);
for (i=0;i<=9;i++)
printf("%d",a[i]);
printf("\n");
}

根据我的理解(不一定对),把你的main改一下:

main()
{
int i,a[10]={3,7,9,44,0,1,2,5,4,6};
for (i=0;i<=9;i++)
printf ("%d",a[i]);
printf("\n");
inv(a,10);
for (i=0;i<=9;i++)
printf("%d",a[i]);
printf("\n");
}
不过由于实在不明白你的inv函数,只好由你自己去修改它了。
zqone 2003-05-23
  • 打赏
  • 举报
回复
void inv(int * x,int n)
{
int temp;
for (;x<=x+4;x++)
{temp=*x;*x=(*(x+n-1))--;*(x+n-1)=temp;}
return;
}
会不会死循环
x<x+4,不是总满足吗???

69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧