新人求助,关于指针的问题。
本帖最后由 蜘蛛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;
}
}
}
求好心人能详细说明一下第一道跟第二道的逻辑。
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: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是不允许访问的,自然就挂了
你的这两道题都写的太深奥了,看不懂
第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("");
}
}
第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);
} 第二道行列
#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("");
}
} AntiDebug 发表于 2014-5-18 23:41 static/image/common/back.gif
if(*(p+j)
真是感谢解答了。也让我看到了不同的解答逻辑。
你不说我还没发现第三组中有两个不及格的。 #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;}
感谢各位的解答。真是谢谢了,也让我可以看到不同的逻缉。
第二题的错误是因为含数没有返回值导致。只要加上两条语句就可以解决了。 AntiDebug 发表于 2014-5-18 23:53 static/image/common/back.gif
第二题
逻辑有问题, main函数中这段代码
我用的是VC++6.0,经常有语法错误时,不会提示内存错误,或中断之类的。。。
页:
[1]