| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 26766 人关注过本帖
标题:如何正确使用指针数组?
只看楼主 加入收藏
清微御宇
Rank: 6Rank: 6
来 自:开封
等 级:侠之大者
威 望:2
帖 子:318
专家分:497
注 册:2012-1-15
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:15 
如何正确使用指针数组?
程序代码:
#include <stdio.h>
void man(int*a[]);
void exchange(int*x,int*y);
int main()//求输入10个数求最大最小并把最大和最后一个数换最小和第一个数换,其它数的位置不变并输出要求必须用指针;
{
    int*a[10],i;
    int b[10];
        /*
            for(i=0;i!=10;i++)
        scanf("%d",a[i]);
           */
    for(i=0;i!=10;i++)//求最大和最小;这里为什么不能直接写成上面注销的那样呢?运行程序时提示程序出错!
    {
        scanf("%d",&b[i]);
            a[i]=&b[i];
    }
      man(a);//这里传递过去的是什么呢?
        for(i=0;i!=10;i++)
        printf("%-4d",*a[i]);
        printf("\n");
return 0;
}
void man(int*a[])//求最大和最小;
{
    int i,*max,*min;
    max=min=a[0];
    for (i=1;i!=10;i++)
    {
        min=a[i]>max?a[i]:max;//这里更是不懂为什么比较地址就能求最大和最小开始写*min=*a[i]>*max?*a[i]:*max;也是不行,后来改成这就行了!
        max=a[i]<min?a[i]:min;//
    }
   exchange(min,a[0]);
   exchange(max,a[9]);
}
void exchange(int*x,int*y)//交换位置;
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
搜索更多相关主题的帖子: 如何 
2012-04-06 20:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:1 
想知道为什么不可以那样,就先问问自己现在写着的是什么。不了解自己写出来的是什么、有什么效果、该如何运用,就不要写,想好了、弄清楚再写。

为什么不能scanf("%d", a[i]),那么看看a[i]是什么,scanf()要使用a[i]干什么,能不能干得了。概念就是基础!

授人以渔,不授人以鱼。
2012-04-06 21:06
share32
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:214
专家分:663
注 册:2011-12-1
收藏
得分:1 
你显然还没有学好基础知识。
数组的赋值、读取方式不同于单个变量,需要区别对待。
还有指针的使用,函数形参、实参等
你得弄明白这些。
然后会看看你的错误,
你会发现这都是最基础的错误。
2012-04-06 21:21
于祥
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:5
帖 子:1047
专家分:4132
注 册:2011-4-24
收藏
得分:2 
程序代码:
#include <stdio.h>

 void man(int*a[]);

 void exchange(int*x,int*y);

 int main()//求输入10个数求最大最小并把最大和最后一个数换最小和第一个数换,其它数的位置不变并输出要求必须用指针;
 {
     int*a[10],i;
     int b[10];
         /*
             for(i=0;i!=10;i++)
         scanf("%d",a[i]);//a[i]是地址
            */
     for(i=0;i!=10;i++)//求最大和最小;这里为什么不能直接写成上面注销的那样呢?运行程序时提示程序出错!
     {
         scanf("%d",&b[i]);//b[i]不是地址,而scanf()中的后边必须是地址
             a[i]=&b[i];
     }
   
      for(i=0;i!=10;i++)
         printf("%d,",b[i]);
         printf("\n");
    
       man(a);//这里传递过去的是什么呢?//a[i]的首地址
     
         for(i=0;i!=10;i++)
         printf("%-4d",*a[i]);
         printf("\n");

 return 0;

 }

 void man(int*a[])//求最大和最小;
 {
     int i,max,min,m,n;
     max =min = *a[0];
     for (i=1;i!=10;i++)
     {
         if (*a[i] > max)
          {
              max = *a[i];
              m = i;
          }
         if (*a[i] < min)
           {
               min = *a[i];
               n = i;
           }
     }
    exchange(a[n],a[0]);
    exchange(a[m],a[9]);

 }

 void exchange(int *x,int *y)//交换位置;
 {

 int temp;

 temp=*x;

 *x=*y;

 *y=temp;

 }


[ 本帖最后由 于祥 于 2012-4-7 11:50 编辑 ]

最基础的往往是你最容易忽略的!
2012-04-06 23:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 4楼 于祥
你再看清楚?

授人以渔,不授人以鱼。
2012-04-07 00:01
于祥
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:5
帖 子:1047
专家分:4132
注 册:2011-4-24
收藏
得分:0 
回复 5楼 TonyDeng
是哪里有问题了?给指正一下

最基础的往往是你最容易忽略的!
2012-04-07 00:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你看楼主问什么

授人以渔,不授人以鱼。
2012-04-07 00:18
于祥
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:5
帖 子:1047
专家分:4132
注 册:2011-4-24
收藏
得分:0 
回复 7楼 TonyDeng
那应该怎样解释楼主的问题,我的能力就这样了求指点

最基础的往往是你最容易忽略的!
2012-04-07 00:24
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:16 
int*a[10];
楼主其实自己都有怀疑,所以偷巧写成那样,这个其实应该写成:
int* a[10];  (写成int *a[10];也是符合语法的,但会误导自己,以为指向的是int型数据,但编译器不会理解错,是你自己理解错)
表示a是储存10个int*指针的数组,是10个指针,不是10个int数据,所以这些指针全部是没有指向数据实体的,当把a[i]传给scanf()函数,scanf()把这个a[i]里面的指针值视为某个int型数据实体的地址,要对它进行解引用,给那个地址处的内存赋值,由于指针a[i]没有初始化,所以崩溃。

对,在语法上,编译器接受scanf("%d", a[i])这样的编码,但那仅仅是过了语法检查关,并不表示运行也能正确。scanf()需要指针,你就给它指针,但指针指向对不对,编译器是无法检查出来的。

不要把int* i当作定义了一个int数据,这是我反复说过的。有人必然有名片,但有名片不必然就有人,人是数据实体,指针只是名片,名片是可以乱印的。都把指针当神器,但如果不深刻了解,只能是搬起石头砸自己的脚。写出int*a[10]这样的代码,必须自己很清楚那是什么意思,能够怎么用,必须怎么用,搞不清楚,就老老实实地定义int a[10],就如下面int b[10]能用一样。定义指针之后,总得在内存中开辟数据实体,除了数据实体本身占用的内存之外,还附带多了一个指针变量也占用内存的开销,省不了内存(其实按指针寻址是间接寻址,操作是先取指针地址值定位地址然后再取值,步骤比直接寻址多了两步,时间上也不占优),但更容易令你出错。指针用在该用的地方,而且能不用就尽量不用,不要被人误导,总想用指针显威风,没有任何一本编程实用指南指导程序员尽量采用指针。信不信由你,未出校门的人就喜欢中这种毒,将来害死你的时候,不要后悔。

指针,是在程序的实际迫使不得不用,或者能够使代码显得更清晰、表达更自然的时候,应该采用。如果不具备这样的效果,就不要用,哪怕牺牲一点点速度性能,也要优先保证代码的清晰性和可维护性,这才是正确性的保障基础,代码不清晰,连排错都成问题,排错的时间比赢得的那一点点毫秒级的时间多不知几千万倍,论人工按时间摊下来的成本,那么一点速度优势弥补得来吗。做项目的头儿,如果不懂衡量取舍这种综合关系,纯走技术路线,他根本没资格坐这位置,而凡是有这种观念的人,都注定不是做项目头子的料,不管他吹得多牛,一说这种话,就彻底暴露,要么是撒谎,要么是哪个傻瓜老板被南郭先生骗了。

[ 本帖最后由 TonyDeng 于 2012-4-7 01:01 编辑 ]

授人以渔,不授人以鱼。
2012-04-07 00:36
清微御宇
Rank: 6Rank: 6
来 自:开封
等 级:侠之大者
威 望:2
帖 子:318
专家分:497
注 册:2012-1-15
收藏
得分:0 
回复 9楼 TonyDeng
看来我又想当然了,呵呵,由衷感谢版版孜孜不倦的教导!

Stay hungry , Stay foolish!
2012-04-07 07:51
快速回复:如何正确使用指针数组?
数据加载中...
 
   



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

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