| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 596 人关注过本帖
标题:指针的错误
只看楼主 加入收藏
换空依晨
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2013-9-13
结帖率:30.77%
收藏
已结贴  问题点数:10 回复次数:11 
指针的错误
程序代码:
#include "stdio.h"
main()
{
int a[3][4]={65,67,66,60,80,83,87,88,90,99,91,95};
int *p,max,min,i,j;
float average=0.0;
p=a[0];
max=min=a[0][0];
for(i=0;i<3;i++)
  for(j=0;j<4;j++)
     { if(*(*(p+i)+j))>max) max=*(*(p+i)+j);
       if(*(*(p+i)+j))>max) min=*(*(p+i)+j);
       average+=*(*(p+i)+j);
  }

printf("max=%d\n",max);
printf("min=%d\n",min);
printf("average=%f\n",average/12);
}
怎么运行有错误
2013-10-23 21:47
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:2 
        if(*(*(p+i)+j))>max) max=*(*(p+i)+j);
        if(*(*(p+i)+j))>max) min=*(*(p+i)+j);
没有发现什么错误?

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-10-23 22:22
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
void main()
 {
    int a[3][4]={65,67,66,60,80,83,87,88,90,99,91,95};
    int *p,max,min,i,j;
    float average=0.0;
    p=&a[0][0];
    max=min=a[0][0];
    for(i=0;i<3;i++)  {
        for(j=0;j<4;j++) {
            if (*(p + i*3 + j) > max) max=*(p + i*3 + j) ;
            if (*(p + i*3 + j) < min) min=*(p + i*3 + j) ;

                average += *(p + i*3 + j);
        }
    }
   
    printf("max=%d\n",max);
    printf("min=%d\n",min);
    printf("average=%f\n",average/12);
 }

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-10-23 22:25
ljx小子
Rank: 8Rank: 8
来 自:星星
等 级:蝙蝠侠
威 望:2
帖 子:222
专家分:916
注 册:2013-10-7
收藏
得分:2 
你这个应该用二维数组的指针,你看一下下面的解释
概括的说,指针其实就是可变数组的首地址,说是可变数组,是
指其包含内容的数量的可变的,并且是可动态申请和释放的,从而充
分节约宝贵的内存资源。我一向喜欢一维数组,除非万不得已,我一
般是不用二维数组的,多维的则更是很少涉足了。因为一维简单,容
易理解,而用指针指向的多维数组就具有相当的复杂性了,也因此更
具有讨论的必要。
    闲话少说,这里我就以三个二维数组的比较来展开讨论:
    (1)、int **Ptr;
    (2)、int *Ptr[ 5 ];
    (3)、int ( *Ptr )[ 5 ];
    以上三例都是整数的二维数组,都可以用形如 Ptr[ 1 ][ 1 ] 的
方式访问其内容;但它们的差别却是很大的。下面我从四个方面对它们
进行讨论:
    一、内容:
       它们本身都是指针,它们的最终内容都是整数。注意我这里说
的是最终内容,而不是中间内容,比如你写 Ptr[ 0 ],对于三者来说,
其内容都是一个整数指针,即 int *;Ptr[ 1 ][ 1  ] 这样的形式才
是其最终内容。
    二、意义:
       (1)、int **Ptr 表示指向"一群"指向整数的指针的指针。
       (2)、int *Ptr[ 5 ] 表示指向 5 个指向整数的指针的指针。
       (3)、int ( *Ptr )[ 5 ] 表示指向"一群"指向 5 个整数数
组的指针的指针。
    三、所占空间:
       (1)、int **Ptr 和 (3)、int ( *Ptr )[ 5 ] 一样,在32位平
台里,都是4字节,即一个指针。
       但 (2)、int *Ptr[ 5 ] 不同,它是 5 个指针,它占5 * 4 = 20
个字节的内存空间。
    四、用法:
       (1)、int **Ptr  
       因为是指针的指针,需要两次内存分配才能使用其最终内容。首
先,Ptr = ( int ** )new int *[ 5 ];这样分配好了以后,它和(2)的
意义相同了;然后要分别对 5 个指针进行内存分配,例如:
  Ptr[ 0 ] = new int[ 20 ];
  它表示为第 0 个指针分配 20 个整数,分配好以后, Ptr[ 0 ] 为指
向 20 个整数的数组。这时可以使用下标用法 Ptr[ 0 ][ 0 ] 到
Ptr[ 0 ][ 19 ] 了。
      如果没有第一次内存分配,该 Ptr 是个"野"指针,是不能使用
的,如果没有第二次内存分配,则 Ptr[ 0 ] 等也是个"野"指针,也
是不能用的。当然,用它指向某个已经定义的地址则是允许的,那是另外
的用法(类似于"借鸡生蛋"的做法),这里不作讨论(下同)。
      (2)、int *Ptr[ 5 ]
      这样定义的话,编译器已经为它分配了 5 个指针的空间,这相当
于(1)中的第一次内存分配。根据对(1)的讨论可知,显然要对其进行一次
内存分配的。否则就是"野"指针。
      (3)、int ( *Ptr )[ 5 ]
      这种定义我觉得很费解,不是不懂,而是觉得理解起来特别吃力,
也许是我不太习惯这样的定义吧。怎么描述它呢?它的意义是"一群"
指针,每个指针都是指向一个 5 个整数的数组。如果想分配 k 个指针,
这样写: Ptr = ( int ( * )[ 5 ] ) new int[ sizeof( int ) * 5 * k ]。
这是一次性的内存分配。分配好以后,Ptr 指向一片连续的地址空间,
其中 Ptr[ 0 ] 指向第 0 个 5 个整数数组的首地址,Ptr[ 1 ] 指向第
1 个 5 个整数数组的首地址。
   综上所述,我觉得可以这样理解它们:
   int ** Ptr <==> int Ptr[ x ][ y ];
   int *Ptr[ 5 ] <==> int Ptr[ 5 ][ x ];
   int ( *Ptr )[ 5 ] <==> int Ptr[ x ][ 5 ];
   这里 x 和 y 是表示若干的意思。

。。。。。。。。。。。
2013-10-24 15:37
zhaogay
Rank: 7Rank: 7Rank: 7
来 自:宫
等 级:黑侠
帖 子:151
专家分:586
注 册:2013-10-10
收藏
得分:2 
回复 4楼 ljx小子
牛X

好好学习,天天想上
2013-10-24 16:27
haiboself
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:193
专家分:196
注 册:2013-10-23
收藏
得分:2 
我才搞到函数...厉害!!!
2013-10-24 17:04
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:2 
回复 4楼 ljx小子
详细
2013-10-24 18:01
ljx小子
Rank: 8Rank: 8
来 自:星星
等 级:蝙蝠侠
威 望:2
帖 子:222
专家分:916
注 册:2013-10-7
收藏
得分:0 
回复 7楼 tlliqi
网上找的详细资料,我也只是了解一点二维数组的指针

。。。。。。。。。。。
2013-10-24 22:23
换空依晨
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2013-9-13
收藏
得分:0 
回复 2楼 yuccn
改过来了 还是有错啊
2013-10-25 09:03
换空依晨
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2013-9-13
收藏
得分:0 
回复 3楼 yuccn
应该是(*(p + i*4 + j))吧 我写的除了小于号 哪里错了
2013-10-25 09:09
快速回复:指针的错误
数据加载中...
 
   



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

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