| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1172 人关注过本帖
标题:要疯了,指针问题求高手帮忙。
取消只看楼主 加入收藏
飘在深圳
Rank: 1
等 级:新手上路
帖 子:27
专家分:5
注 册:2010-2-28
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
要疯了,指针问题求高手帮忙。
题目:向一个数组(10个元素)中输入数据,要求把数组中最大的元素与第一个元素互换,最小的一个元素与最后一个
      元素互换。
问题现象:如果顺序输入“1-10”,则按照原样输出,如果输入其它的数据,结果正常。
#include "stdio.h"
void main()
{
    int a[10]={0};
    int i,*p1;
    void k(int a[]);
    for(p1=a;p1<(&a[0]+10);p1++)
    {
    printf("please input nmuber \n");
    scanf("%d",p1);
    }
    p1=a;
    for(i=0;i<10;i++)
    printf("%5d",*p1++);
    k(a);
}
void k(int a[])
{
    int max,min,*p,*a_end,*m,*n,t;
    a_end=a+10;
    max=min=*a;
    m=n=a;
    for(p=a+1;p<a_end;p++)
    {
        if(max<*p)
        {
            max=*p;
            m=p;
        }
        if(min>*p)
        {
            min=*p;
            n=p;
        }
    }
    printf("\nmax=%d,min=%d\n",max,min);
    printf("\nmax=%d,min=%d\n",*m,*n);
    printf("\nmax=%0x,min=%0x\n",m,n);
    t=*m;*m=*a;*a=t;
    t=*n;*n=*(a+9);*(a+9)=t;
    for(t=0;t<10;t++)
    printf("%5d",a[t]);
}
谢谢。
搜索更多相关主题的帖子: 指针 
2010-03-03 00:43
飘在深圳
Rank: 1
等 级:新手上路
帖 子:27
专家分:5
注 册:2010-2-28
收藏
得分:0 
指导下,谢谢。
2010-03-03 11:11
飘在深圳
Rank: 1
等 级:新手上路
帖 子:27
专家分:5
注 册:2010-2-28
收藏
得分:0 
补充一点,在void k(int a[])
中添加
    printf("\n %d",sizeof(a));
得到的结果是4.
2010-03-03 11:14
飘在深圳
Rank: 1
等 级:新手上路
帖 子:27
专家分:5
注 册:2010-2-28
收藏
得分:0 
int a[10]={0};
    int i,*p1;
    void k(int a[]);<-----------------------------------你这 是申明 还是调用???  申明 位置不对 调用 格式 也不对啊
    for(p1=a;p1<(&a[0]+10);p1++)
————————————————
是申明啊,只是放的位置应该在定义前面,呵呵,以后注意。
但是调用的格式有什么问题?调用不会出现问题。
2010-03-03 12:59
飘在深圳
Rank: 1
等 级:新手上路
帖 子:27
专家分:5
注 册:2010-2-28
收藏
得分:0 
  
    int i,*p1;
    p1=a;---加个这干啥哟,编译都通不过。
    void k(int a[]);
    for(p1=a;p1<(&a[0]+10);p1++)
2010-03-03 13:36
飘在深圳
Rank: 1
等 级:新手上路
帖 子:27
专家分:5
注 册:2010-2-28
收藏
得分:0 
根据你的思路,改写了一下程序,问题还是存在。
你在功能函数中使用的语句:
*p=array[0];array[0]=l;l=*p;
没有对P初始化,系统分配的地址分配的内存,不能随便赋值,程序运行后会弹出内存错误告警。
可能我没有理解你说的“实参还没出来,调用功能函数,是无意义的。”,能否再说详细点,谢谢。
#include "stdio.h"
void main()
{
    int a[10]={0};
    int i,*p1;
    void k(int a[]);
    for(p1=a;p1<(&a[0]+10);p1++)
    {
    printf("please input nmuber \n");
    scanf("%d",p1);
    }
    p1=a;
    for(i=0;i<10;i++)
    printf("%5d",*p1++);
    k(a);
}
void k(int array[])
{
  int *max,*min,k,l;
  int *p,*arr_end;
  arr_end=array+10;
  max=min=array;
  for(p=array+1;p<arr_end;p++)
      if(*p>*max) max=p;
          else if(*p<*min) min=p;
  k=*max;
  l=*min;
  *p=array[0];array[0]=l;l=*p;
  *p=array[9];array[9]=k;k=*p;
   /* int max,min,*p,*a_end,*m,*n,t;
    a_end=a+10;
    max=min=*a;
    m=n=a;
    for(p=a+1;p<a_end;p++)
    {
        if(max<*p)
        {
            max=*p;
            m=p;
        }
        if(min>*p)
        {
            min=*p;
            n=p;
        }
    }
    printf("\nmax=%d,min=%d\n",max,min);
    printf("\nmax=%d,min=%d\n",*m,*n);
    printf("\nmax=%0x,min=%0x\n",m,n);
    t=*m;*m=*a;*a=t;
    t=*n;*n=*(a+9);*(a+9)=t;
    for(t=0;t<10;t++)
    printf("%5d",a[t]);
    */
}
2010-03-03 16:10
飘在深圳
Rank: 1
等 级:新手上路
帖 子:27
专家分:5
注 册:2010-2-28
收藏
得分:0 
逗我哪。。。。
你除了输入改变了下,把10改成9,<改成<=,没看其他改变,运行结果跟原来一样。。。。。。
2010-03-03 17:55
飘在深圳
Rank: 1
等 级:新手上路
帖 子:27
专家分:5
注 册:2010-2-28
收藏
得分:0 
按照你的方法,尝试过以下两种方法:
1.把t=*n;*n=*(a+9);*(a+9)=t;删除,
  加上:
    if (*n != min)
    {
        t = *m;
        *m = *(a + 9);
        *(a + 9) = t;
    }
 输入1-10,可以得到预期的排序效果,
但是如果输入其它的序列, 如:2 3 5 -7 5 4 2 1 6 5
                     输出为:6 3 5 -7 5 4 2 1 2 5
可见没有把最小的数与最后一个元素交换,可见if (*n != min)在此并未生效,回到程序,看到*n被赋值的地方为:
        if(min>*p)
        {
            min=*p;
            n=p;
        }
此时*n=*p,而min=*p,可见*n==min的判断恒成立。
再反观输入从1-10的情况,由于if(min>*p)的判断始终不成立,所以n的值还是等于初始值,即n=a,*n=*a,
在执行:t=*m;*m=*a;*a=t;后,
a[0]和a[9]的值进行了互换,此时*n=a[9],而min还是初始的赋值min=a[0],在这种情况下if (*n != min)
成立,可见这种方法行不通。
2.不去掉t=*n;*n=a[9];a[9]=t;
  加上if (*n != min)
      {   
           t = *m;
           *m = *(a + 9);
           *(a + 9) = t;
      }
 输入1-10,得到的结果还是1-10,没有改变,
 输入2 -3 4 5 6 7  1 2 3 4
 输出7  4 4 5 6 -3 1 2 3 2
分析了一下为什么会出现这种情况,在执行完
t=*m;*m=*a;*a=t;  
t=*n;*n=*(a+9);*(a+9)=t
后,输入:      2 -3 4 5 6 7  1 2 3 4
    输出:      7  4 4 5 6 2  1 2 3 -3
前面的输出:    7  4 4 5 6 -3 1 2 3 2
可见,把-3与2又进行了调换。
回到程序:
  if (*n != min)
  {
    t = *m;
    *m = *(a + 9);
    *(a + 9) = t;
  }
上面的执行结果就是把-3与2进行了调换,先看对n赋值的地方,由于输入的数列不是1-10,所以n的值肯定会改变,赋值的语句为:
        if(min>*p)
        {
            min=*p;
            n=p;
        }
根据上面输入的元素,可以看出n为-3这个元素的地址,即&a[1],min=-3,在执行
t=*n;*n=*(a+9);*(a+9)=t;后,n所指向的内容不再是-3,而是原数组中a[9]的值,在这里为4,因此*n != min的判断结果为1,分析下面的语句:
    t = *m;
    *m = *(a + 9);
    *(a + 9) = t;
通过:
        if(max<*p)
        {
            max=*p;
            m=p;
        }
结合输入的元素可以看出*m=7,m=&a[5],再通过执行此时*m=*a,即*m=2,再执行*m = *(a + 9);可见这里是把a[5]与a[9]进行了互换,得到了上面的输出结果。
可见上面两种方法行不通。
把程序中 ,
t=*n;*n=a[9];a[9]=t;
改为:  
    if(a[9]!=min)
    {
    t=*n;*n=a[9];a[9]=t;
    }
即可。
非常感谢“浅墨”的指导,我也是刚看懂指针这一部分,发现这部分看懂容易,要能灵活运用还需下不少功夫,还望以后都能不吝赐教,谢谢。
  
2010-03-04 21:20
快速回复:要疯了,指针问题求高手帮忙。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016804 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved