蜘蛛X 发表于 2014-5-18 03:27:04

新人求助,关于指针的问题。

本帖最后由 蜘蛛X 于 2014-5-18 05:29 编辑

题是:少于60分的打出编号与成绩。想了很久有两个问题一直想不明白。求解答。
第一道解题:
#include <stdio.h>
int main()
{
      int sb[]={{78,78,97,45},{77,58,68,71},{81,68,87,67},{48,89,61,54}};
      int *p;
      int i,j,k;
      for(i=0;i<4;i++)
      {
                p=sb;//这里是p=sb[   i    ]不知为什么,网页会把给删掉[   i    ]
                for(j=0;j<4;j++)
                {
                        if(*(p+j)<60)
                        {
                              printf("%d=",i);
                              for(k=0;k<4;k++)
                              {
                                        printf("%d,",*(p+k));
                              }
                              printf("\n");
                              break;
                        }
                }
      }
}
如果这里不用上break返回的话,为什么会重复打印两次编号3的?


还有下面的用含数解法虽然是能运行,但遇到了那组元素中没不及格时,后面的就不会输出了。虽然是知道指针的问题。但实在是想不出怎么修改好。
#include <stdio.h>
int main()
{
      int sb[]={{78,78,97,45},{77,58,68,71},{81,68,87,67},{48,89,61,54}};
      int *p;
      int *cor(int (*pointer),int n);
      int i,j;
      for(i=0;i<4;i++)
      {
                p=cor(sb,i);
                for(j=0;j<4;j++)
                {
                        printf("%d,",*(p+j));
                }
                printf("\n");
      }
      
}

int *cor(int (*pointer),int n)
{
      int *p,i,j,*b;
      p=*(pointer+n);
      for(i=0;i<4;i++)
      {
                if(*(p+i)<60)
                {
                        b=p;
                        return b;
                }

      }
}

求好心人能详细说明一下第一道跟第二道的逻辑。

AntiDebug 发表于 2014-5-18 23:41:07

if(*(p+j)<60)

4个数字里面判断有没有小于60的,如果有,就把这组数字打印出来,就可以break了
{ 1 61 63 6 }
上面4个数中,第一个数字就小于60,所以就不用再找了,直接打印出来就可以了
继续从下一个 { } 数组中寻找是否有小于60的所以break就可以了

{ 1 61 63 6 }
如果不break,下面找到6的时间 还要打印一次出来

AntiDebug 发表于 2014-5-18 23:53:42

本帖最后由 AntiDebug 于 2014-5-18 23:55 编辑

第二题

逻辑有问题, main函数中这段代码
p=cor(sb,i);
for(j=0;j<4;j++)
{
printf("%d,",*(p+j));
}

无论如何都会执行打印,而错误也正是这段代码引发的

当第三个数组的时间

{81,68,87,67}

没有一个数小于60的,所以自然不会走

b=p;
return b;

这个流程,

而你 int *cor(int (*pointer),int n) 这个函数又没有写其他返回值

所以取了 EAX的值返回了 ,此时EAX是3 ,所以提示

指令引用的 "0x00000003" 内存。该内存不能为 "read"。
操作系统中前64K是不允许访问的,自然就挂了



1980469235 发表于 2014-5-19 00:46:13

你的这两道题都写的太深奥了,看不懂
第1题
#include <stdio.h>
int main()
{
      int sb[]={{78,78,97,45},{77,58,68,71},{81,68,87,67},{48,89,61,54}};
      int (*p);
      int i,j,k;
                p = sb;
                scanf("%d",&k);
      for(i=0;i<k;i++)
      {
               //这里是p=sb[   i    ]不知为什么,网页会把给删掉[   i    ]
                for(j=0;j<4;j++)
                {
                        if(*(*(p+j)+i)>60)
                        {
                              printf("及格=%d",sb);
                        }
                                                else
                                                {
                                                        printf("不及格=%d",sb);
                                                }
                }
                                printf("\n");
      }
}
第二题
#include <stdio.h>
void main()
{
      int sb[]={{78,78,97,45},{77,58,68,71},{81,68,87,67},{48,89,61,54}};
      
      void cor(int (*pointer),int n);
      int i,j,n;
      scanf("%d",&n);
                cor(sb,n);
                for(i = 0; i < n; i++)
                {
                        for(j = 0; j < 4; j++)
                        {
                                if(sb > 60)
                                {
                                        printf("及格%6d\n",sb);
                                }
                                else
                                {
                                        printf("不及格%6d\n",sb);
                                }
                        }
                        printf("\n");
                }
      
}

void cor(int (*pointer),int n)
{
      int i;
      
      for(i=0;i<n;i++)
      {
                        printf("");
      }
}

1980469235 发表于 2014-5-19 00:53:30

第1道行列
#include <stdio.h>
int main()
{
      int sb[]={{78,78,97,45},{77,58,68,71},{81,68,87,67},{48,89,61,54}};
      int (*p);
      int i,j,k,h,l;
                p = sb;
                scanf("%d",&k);
      for(i=0;i<k;i++)
      {
               //这里是p=sb[   i    ]不知为什么,网页会把给删掉[   i    ]
                for(j=0;j<4;j++)
                {
                        if(*(*(p+j)+i)<60)
                        {
                              h = i;
                                                          l = j;
                                                        printf("%d 行=%d 列=%d\n",sb, h, l);
                                                }
                }
                                printf("\n");
      }
                //printf("行=%d 列=%d\n",h, l);
}

1980469235 发表于 2014-5-19 00:57:13

第二道行列
#include <stdio.h>
void main()
{
      int sb[]={{78,78,97,45},{77,58,68,71},{81,68,87,67},{48,89,61,54}};
      
      void cor(int (*pointer),int n);
      int i,j,n,h,l;
      scanf("%d",&n);
                cor(sb,n);
                for(i = 0; i < n; i++)
                {
                        for(j = 0; j < 4; j++)
                        {
                              if(sb < 60)
                              {
                                        h = i;
                                                                                l = j;
                                                                                printf("%d 行%d 列%d",sb,h,l);
                              }
                        }
                        printf("\n");
                }
      
}

void cor(int (*pointer),int n)
{
      int i;
      
      for(i=0;i<n;i++)
      {
                        printf("");
      }
}

蜘蛛X 发表于 2014-5-19 02:46:37

AntiDebug 发表于 2014-5-18 23:41 static/image/common/back.gif
if(*(p+j)

真是感谢解答了。也让我看到了不同的解答逻辑。
你不说我还没发现第三组中有两个不及格的。

蜘蛛X 发表于 2014-5-19 02:50:42

#include <stdio.h>
int main()
{
      int sb[]={{78,78,97,45},{77,58,68,71},{81,68,87,67},{48,89,61,54}};
      int *p;
      int *cor(int (*pointer),int n);
      int i,j;
      for(i=0;i<4;i++)
      {
                if(p=cor(sb,i))
                                {
                for(j=0;j<4;j++)
                {
                        printf("%d,",*(p+j));
                }
                printf("\n");
                                }
      }
      
}

int *cor(int (*pointer),int n)
{
      int *p,i,j;
      p=*(pointer+n);
      for(i=0;i<4;i++)
      {
                if(*(p+i)<60)
                {
                        return p;
                }

      }
                return NULL;}

感谢各位的解答。真是谢谢了,也让我可以看到不同的逻缉。
第二题的错误是因为含数没有返回值导致。只要加上两条语句就可以解决了。

蜘蛛X 发表于 2014-5-19 02:57:08

AntiDebug 发表于 2014-5-18 23:53 static/image/common/back.gif
第二题

逻辑有问题, main函数中这段代码


我用的是VC++6.0,经常有语法错误时,不会提示内存错误,或中断之类的。。。
页: [1]
查看完整版本: 新人求助,关于指针的问题。