鱼C论坛

 找回密码
 立即注册
查看: 2066|回复: 8

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

[复制链接]
发表于 2014-5-18 03:27:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

题是:少于60分的打出编号与成绩。想了很久有两个问题一直想不明白。求解答。
第一道解题:
#include <stdio.h>
int main()
{
        int sb[][4]={{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[i][i][i];//这里是p=sb[   i    ][i]不知为什么,网页会把给删掉[/i][/i][/i][/i][i][i][   i    ][/i][/i][i][i][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[][4]={{78,78,97,45},{77,58,68,71},{81,68,87,67},{48,89,61,54}};
        int *p;
        int *cor(int (*pointer)[4],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)[4],int n)
{
        int *p,i,j,*b;
        p=*(pointer+n);
        for(i=0;i<4;i++)
        {
                if(*(p+i)<60)
                {
                        b=p;
                        return b;
                }

        }
}

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

[/i][/i][/i][/i]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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的时间 还要打印一次出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)[4],int n) 这个函数又没有写其他返回值

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

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



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-19 00:46:13 | 显示全部楼层
你的这两道题都写的太深奥了,看不懂
第1题
#include <stdio.h>
int main()
{
        int sb[][4]={{78,78,97,45},{77,58,68,71},{81,68,87,67},{48,89,61,54}};
        int (*p)[4];
        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[j][i]);
                        }
                                                else
                                                {
                                                        printf("不及格=%d",sb[j][i]);
                                                }
                }
                                printf("\n");
        }
}
第二题
#include <stdio.h>
void main()
{
        int sb[][4]={{78,78,97,45},{77,58,68,71},{81,68,87,67},{48,89,61,54}};
        
        void cor(int (*pointer)[4],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[j][i] > 60)
                                {
                                        printf("及格%6d\n",sb[j][i]);
                                }
                                else
                                {
                                        printf("不及格%6d\n",sb[j][i]);
                                }
                        }
                        printf("\n");
                }
        
}

void cor(int (*pointer)[4],int n)
{
        int i;
        
        for(i=0;i<n;i++)
        {
                        printf("");
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-19 00:53:30 | 显示全部楼层
第1道行列
#include <stdio.h>
int main()
{
        int sb[][4]={{78,78,97,45},{77,58,68,71},{81,68,87,67},{48,89,61,54}};
        int (*p)[4];
        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[j][i], h, l);
                                                }
                }
                                printf("\n");
        }
                //printf("行=%d 列=%d\n",h, l);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-19 00:57:13 | 显示全部楼层
第二道行列
#include <stdio.h>
void main()
{
        int sb[][4]={{78,78,97,45},{77,58,68,71},{81,68,87,67},{48,89,61,54}};
        
        void cor(int (*pointer)[4],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[j][i] < 60)
                                {
                                        h = i;
                                                                                l = j;
                                                                                printf("%d 行%d 列%d",sb[j][i],h,l);
                                }
                        }
                        printf("\n");
                }
        
}

void cor(int (*pointer)[4],int n)
{
        int i;
        
        for(i=0;i<n;i++)
        {
                        printf("");
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-19 02:46:37 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-19 02:50:42 | 显示全部楼层
#include <stdio.h>
int main()
{
        int sb[][4]={{78,78,97,45},{77,58,68,71},{81,68,87,67},{48,89,61,54}};
        int *p;
        int *cor(int (*pointer)[4],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)[4],int n)
{
        int *p,i,j;
        p=*(pointer+n);
        for(i=0;i<4;i++)
        {
                if(*(p+i)<60)
                {
                        return p;
                }

        }
                return NULL;}

感谢各位的解答。真是谢谢了,也让我可以看到不同的逻缉。
第二题的错误是因为含数没有返回值导致。只要加上两条语句就可以解决了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-19 02:57:08 | 显示全部楼层
AntiDebug 发表于 2014-5-18 23:53
第二题

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

我用的是VC++6.0,经常有语法错误时,不会提示内存错误,或中断之类的。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 00:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表