我认为说这个主题是什么并不重要。我只想提一下,我想打印i
和a
以及1
。
这是我的代码:
int riz(int k,int *p,int *q)
{
int i;
int a;
for (i = 1; i <= sqrt((double)k) + 1; i++)
{
for (a = 1 ; a <= sqrt((double)k) + 1; a++)
{
if (a*a+i*i == k)
{
p=&a;
*p=a;
q=&i;
*q=i;
return 1;
}
}
}
return 0;
}
int main(int argc, char *argv[])
{
int p;
int q;
int a;
printf("Give me a number or type 0 to exit \n");
scanf("%d", &a);
if (a == 0)
return 0;
printf("%d\n", riz(a, &p, &q));
while (a != 0)
{
printf("Give me a number or type 0 to exit \n");
scanf("%d", &a);
if (a == 0)
return 0;
printf("%d\n", riz(a, &p, &q));
}
return 0;
}
我已经阅读了与此相关的其他问题,但我仍然无法弄清楚为什么我无法打印i
和a
。
答案 0 :(得分:2)
问题在于:
if (a*a+i*i==k){
p=&a; // p now points to a in riz instead of a in main
*p=a; // This is equivalent to a=a
q=&i; // q now points to i in riz instead of i in main
*q=i; // This is equivalent to i=i
更改为:
if (a*a+i*i==k){
*p=a; // This will write the value of a in riz to a in main
*q=i; // This will write the value of i in riz to i in main
答案 1 :(得分:0)
答案 2 :(得分:0)
你正在改变什么&#39; p&#39;是指&#39; a&#39; (p =&amp; a)和&#39; a&#39;在函数结束时超出范围。如果你只是使* p = a那么那将保持p指向的值为&#39; a&#39;。
同样适用于您的其他变量&#39; q&#39;所以你的代码最终会以
结束if (a*a+i*i==k){
*p=a;
*q=i;
}
这是因为您正在使函数中传递的指针指向“riz”的本地变量。方法,所以当方法&#39; riz&#39;终止变量a和i超出范围,对你的主要意义不重要。因此,上面的代码设置了&#39; p&#39;指出&#39; a&#39;这是我认为你想要的。
答案 3 :(得分:0)
在调用站点,您需要将指针传递给您希望放置返回值的变量,您正在执行此操作:
int main(int argc, char *argv[]) {
int p;
int q;
...
riz(a,&p,&q)
到目前为止,这么好;但是,在函数中,您只需将要返回的值分配给指针已指向的位置。你不想改变指针;调用者已经将它们设置为应该指向的位置。这是错的:
p=&a;
*p=a;
q=&i;
*q=i;
应该只是:
*p=a;
*q=i;
最后,如果要在函数返回后打印值,则必须调用该函数,然后打印值。之一:
printf("%d", riz(a,&p,&q));
printf(" %d %d\n", p, q);
或者,如果您想通过一次调用printf
来执行此操作:
int r;
r = riz(a,&p,&q);
printf("%d %d %d\n", r, p, q);
NOT 执行:
printf("%d %d %d\n", riz(a,&p,&q), p, q);
因为C不保证评估参数的顺序,所以在调用 但请注意,当 在一个不相关的说明中,p
之前,q
和riz
可能是它们的值。< / p>
riz
返回0
时,p
和q
不已更新,因此其值将为垃圾(我们盲目打印)。如果这确实是您希望它的工作方式,您可能需要检查返回值以确定是否要对p
和q
执行任何操作。main
中存在一个主要的代码复制问题(几乎一半的代码被复制,这意味着你必须完成两次修复bug的工作)。为什么不这样做:int main(int argc, char *argv[])
{
int p;
int q;
int a;
for(;;) {
printf("Give me a number or type 0 to exit \n");
scanf("%d", &a);
if (a == 0)
break;
printf("%d\n", riz(a, &p, &q));
}
return 0;
}