繁体   English   中英

解引用从另一个函数传递给main()的指针

[英]De-Referencing a pointer passed from another function to main()

我正在尝试使用单独的函数通过scanf() (在main之外scanf()输入数据。 该新功能应该先打印一条线,然后从用户那里接收输入。 但是,在我用来测试的函数中的scanfmain函数中的printf()函数之间似乎出现了问题。

我相信我从函数中收到了一个指针,但是某些编译器警告使我怀疑我对指针的假设是否正确。

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

#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函数需要传递一个地址参数。 必须使用地址参数的原因是因为函数调用结束后会擦除函数的本地内存。 因此,为了处理在主函数中声明的变量,我传递了有问题的变量的地址,以便在函数结束时不会丢失更改。

在主函数内部,当使用&scanNum作为参数调用set_info时,它将给变量tp传递引用,以便可以为该变量分配由函数中scanf语句生成的值。

我意识到,正如SO的出色人士正确指出的那样,我做错了什么,是我试图调用set_info就像它返回一个值,但实际上像我实际想要的那样更改了变量。

再次感谢您的帮助!

该功能:

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基础的书:)

我会将变量传递到您的set_Info函数中,以便它知道将数据保存在何处。 然后,这将允许您扫描多个值,并且可以简单地增加指针。 确保使用&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);
}

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

printf("%d", scanNum);

正如liho所说,您需要从set_info返回scanNum,以便可以在函数外部获取它。

int scanNum = set_Info();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM