| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1172 人关注过本帖
标题:要疯了,指针问题求高手帮忙。
只看楼主 加入收藏
飘在深圳
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
q260548893
Rank: 2
等 级:论坛游民
帖 子:24
专家分:46
注 册:2010-2-4
收藏
得分:0 
程序代码:
#include "stdio.h"
void main()
{
    int i, *p1, a[10]={0};
    void k(int a[]);
    printf("please input 10 nmubers: ");
    for(p1=a;p1<(&a[0]+10);p1++)
         scanf("%d",p1);
    printf("\n");
    p1=a;
    for(i=0;i<10;i++)
        printf("%5d",*p1++);
    printf("\n");
    k(a);
}
void k(int a[])
{
    int max,min,*p,*a_end,*m,*n,t;
    a_end=a+9;
    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;
        }
    }
    t=*m;*m=*a;*a=t;
    t=*n;*n=*(a+9);*(a+9)=t;
    for(t=0;t<10;t++)
        printf("%5d",a[t]);
    printf("\n");
}
我帮你改了下,可以了!
2010-03-03 16:43
飘在深圳
Rank: 1
等 级:新手上路
帖 子:27
专家分:5
注 册:2010-2-28
收藏
得分:0 
逗我哪。。。。
你除了输入改变了下,把10改成9,<改成<=,没看其他改变,运行结果跟原来一样。。。。。。
2010-03-03 17:55
浅墨
Rank: 2
等 级:论坛游民
帖 子:18
专家分:53
注 册:2010-2-6
收藏
得分:20 
如果数组中最小数位于第一个 最大位于最后 就会出现你说的问题
原因是以下两行代码:
t=*m;*m=*a;*a=t;  //把最大的和第一位交换 此时最大数的指针指向最后一位 所以交换的是第一位和最后一位
t=*n;*n=*(a+9);*(a+9)=t; // 把最小和最后一位交换  此时最小数的指针指向第一位 而第一位在上一句执行后被交换到了最后一位 所以这一句又将最后一位换回了第一位 问题出现

修改方法供参考:
前一句不变
if (*n != min)
{
    t = *m;
    *m = *(a + 9);
    *(a + 9) = t;
}

整段代码可优化的地方有很多 没有体现出指针应有的简洁 需要多练习
2010-03-03 20:37
飘在深圳
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
q260548893
Rank: 2
等 级:论坛游民
帖 子:24
专家分:46
注 册:2010-2-4
收藏
得分:0 
以下是引用飘在深圳在2010-3-3 17:55:08的发言:

逗我哪。。。。
你除了输入改变了下,把10改成9,<改成<=,没看其他改变,运行结果跟原来一样。。。。。。
不是啊!我在VC上运行可以啊!
2010-03-05 12:42
Devon_Ye
Rank: 4
来 自:广东
等 级:业余侠客
帖 子:124
专家分:282
注 册:2010-1-7
收藏
得分:0 
回复 11楼 飘在深圳
实参没被定义,调用功能函数无意义是指:功能函数只有形参,一定要把实参的值传递给形参,功能函数才能正常运行。这个题目为例:
你的程序为:
int a[10]={0};
void k(int a[]);
此时,你的给功能函数的实际参数为a[10]={0}。
正确的应该为:
int a[10];
for(i=0;i<10;i++)
scanf("%d",&a[i])
void k(int a[]);
这时,给功能函数的实参为a[10]={"你从keyboard输入的值"};

我上贴的程序有个错误,我换了个思路,你可以参考下下面的程序,我有运行ok.
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main()
{

 int a[10], m, n, temp, max = INT_MIN, min = INT_MAX;

 int *p = a;


 for ( int i = 0; i < 10; i++ )

 {
  scanf ("%d", p + i);
  if ( *(p + i) > max )
  {
   max = *(p + i);
   m = i;
  }

 
  if ( *(p + i) < min )
  {
   min = *(p + i);
   n = i;
  }

 }


 temp = *(p + m);

 *(p + m) = *(p + 9);

 *(p + 9) = temp;


 if ( min != *(p + 0) )

 {
  temp = *(p + n);
     *(p + n) = *p;
     *p = temp;

 }


 for ( int i = 0; i < 10; ++i )
     printf ("%d ", *(p + i));


 system ("PAUSE");
    return 0;
}
2010-03-05 13:54
韦春敢
Rank: 3Rank: 3
来 自:广西
等 级:论坛游侠
帖 子:91
专家分:142
注 册:2010-1-25
收藏
得分:0 
VC里真的能用的。。

哈哈
2010-03-05 21:36
快速回复:要疯了,指针问题求高手帮忙。
数据加载中...
 
   



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

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