在查看FILE流的地址时,为什么地址与原始指针的地址有很大不同?

时间:2016-03-25 08:45:51

标签: c++ pointers

请原谅我在这里绝对缺乏理解,只是潜入C ++。所以基本上我只是想看看我是否能弄清楚如何使用putc来正确地将字符写入文件。我想确保我理解每一步。

现在,当查看我最初声明文件指针时使用的地址空间,并在将指针传递给将文件写入文件的其他函数后,我注意到地址空间完全不同,即使在长度,而不是原始函数的地址空间。仍然试图完全包围指针但是没有任何干预就很难告诉你你在哪里误解了事情,我知道我必须这样做。这是代码,不介意我在Qtcreator中这样做的事实。链接有帮助,但请不要只是在指针上复制面食一些C ++信息页面。我已经读过了。

#include <QCoreApplication>
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;

void stream_writer(FILE & stream)
{
    int     c1='A',
            c2='B',
            c3='C',
            nl='\n';

    cout << &stream << endl;
    putc(c1, &stream);
    putc(nl, &stream);
    cout << "written to testfile" << endl;
    fclose(&stream);
    putc(c2, stdout);
    putc(c3, stdout);
    putc(nl, stdout);
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    FILE* testfile;
    testfile = fopen("testfile.txt", "wt");
    if (testfile != NULL )
    {
        cout << &testfile << endl;
        cout << testfile << endl;
        stream_writer(*testfile);
    }
    else
    {
        cout << "Unable to open file\n";
    }

    return a.exec();
}

运行代码后我的控制台输出示例:

  

0x7ffff6aed478
  0x138a200
  0x138a200
  写入testfile
  BC

2 个答案:

答案 0 :(得分:2)

void stream_writer(FILE & stream)

您在此处收到对FILE对象的引用。

cout << &stream << endl;

您在此处通过参考打印FILE对象的地址。

FILE* testfile;

在这里,您要声明指向FILE

的指针
cout << &testfile << endl;

这里是打印指针的值。

stream_writer(*testfile);

在这里,您将取消引用指针作为对象引用传递给被调用函数。

如果所有这些都具有相同的价值,那将是令人惊讶的。

你的期望是错误的。

答案 1 :(得分:1)

cout << &testfile << endl;正在打印FILE指针本身的地址:0x7ffff6aed478

cout << testfile << endl;正在将指针指向的地址打印到:0x138a200

地址0x7ffff6aed478的存储器是存储FILE指针的位置,其值为0x138a200。

地址0x138a200处的内存是分配实际FILE对象的位置,此处的值对应于struct FILE中的数据{...}

stream_writer(*testfile);您正在取消引用以获取FILE对象,并通过引用stream_writer()传递它。 cout << &stream << endl;然后,您再次打印相同FILE对象的地址。因此第三行输出为0x138a200