取消引用从另一个函数传递到main()的指针

时间:2013-02-28 18:13:50

标签: c arrays pointers parameter-passing pass-by-reference

我正在尝试使用单独的函数来使用scanf()main之外)输入数据。这个新功能应该打印一行,然后接收用户的输入。但是,函数中的scanf与我正在测试它的printf()中的main函数之间似乎出现了问题。

我相信我收到了函数的指针,但某些编译器警告让我想知道我对指针的假设是否正确。

我对此代码的输出感到困惑:

#include <stdio.h>
void set_Info(void);

int main()
{
int scanNum = 0;
set_Info();

printf("%d", &scanNum);
return 0;
}

void set_Info(void)          /* start of function definition */

{
int scanNum;

printf("Scan test, enter a number");
scanf("%d",&scanNum);
}

如果我提供一个数字,比如2,则main()中printf语句的结果是:

2665560

现在,只要我能够告诉输出对我来说就像一个内存地址那么我试图解决的问题就是取消引用main中的指针,如下所示:

int scanNum = 0;
int scanNumHolder;

set_Info();

scanNumHolder = *scanNum;
printf("%d", &scanNumHolder);

我相信此代码会将scanNum变量分配给scanNum的解除引用值。但是,当我这样做时,我得到与上面相同的输出。这让我相信两件事之一。要么我没有正确解除引用scanNum,要么在这种情况下scanNum实际上根本不是指针。

我从编译器收到的最常见的错误是:

error: invalid type argument of unary ‘*’ (have ‘int’)

我想,如果我试图将int值视为指针,那么这是有意义的。

如果scanNum没有被正确解除引用,我该如何实现?

感谢您的帮助

*更新

感谢您的帮助。

回顾一下

我的set_info函数需要传递一个地址参数。必须使用地址参数的原因是因为在函数调用结束后擦除函数的本地存储器。因此,为了完成在main函数中声明的变量的工作,我传递了有问题的变量的地址,这样当函数结束时,更改不会丢失。

在main函数内部,当使用&amp; scanNum作为参数调用set_info时,它会传递一个引用变量tp,以便为函数中的scanf语句生成值。

我意识到我所做的错误正如SO的优秀人物正确指出的那样,我试图调用set_info,就像它返回一个值,但实际上改变了变量就像我真正想要的那样。

再次感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

此功能:

void set_Info(void)
{
    int scanNum;
    scanf("%d", &scanNum);
}

从标准输入中读取整数并将其存储到scanNum变量中,该变量是具有自动存储持续时间的局部变量,该变量仅存在于此函数的范围内。

main的正文:

int scanNum = 0;
set_Info();

printf("%d", &scanNum);

定义一个名为scanNum的局部变量,然后以任何方式调用set_Info()函数,该函数不影响scanNum中定义的main,然后打印地址scanNum变量。


这就是你要做的事情:

void set_Info(int* num)
{
    // read an integer and store it into int that num points to:
    scanf("%d", num);
}

int main()
{
    int scanNum = 0;
    // pass the address of scanNum to set_Info function so that
    // changes to scanNum are visible in the body of main as well:
    set_Info(&scanNum);
    printf("%d", scanNum);
    return 0;
}

我还建议您在继续编程之前花更多时间阅读一些带有C语言的书籍。)

答案 1 :(得分:2)

我会将变量传入您的set_Info函数,以便它知道保存数据的位置。这将允许您扫描多个值,您可以简单地增加指针。一定要使用&amp; variableName将变量地址传递给set_Info(),因为该函数需要一个指针

#include <stdio.h>
void set_Info(int *pScanNum);

int main()
{
    int scanNum = 0;
    set_Info(&scanNum);

    printf("%d", scanNum);
    return 0;
}


//Pass in the pointer to scanNum
void set_Info(int *pScanNum)
{
    printf("Scan test, enter a number");
    scanf("%d",pScanNum);
}

答案 2 :(得分:1)

摆脱你的&符号! Printf想要一个整数而不是一个指针。

printf("%d", scanNum);

正如liho所说,你需要从set_info返回scanNum,这样你就可以在函数之外得到它。

int scanNum = set_Info();