Closed. This question needs details or clarity。它当前不接受答案。












想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。

5年前关闭。



Improve this question




如果有人简单地向我解释了何时应该使用&运算符,如何识别/理解我,我将不胜感激。

作为引用:







但是对我来说一切都太抽象了。

例如这里:
当我们在主函数中生成整数时,为什么是



假?

//这里是代码行->
QString errorMsg;
    int errorLine;
   QString errorMsg;
int errorLine;
if (!myDoc.setContent(&file, &errorMsg, &errorLine)) {


        ...
    }

以及例如在这里如何被认可,



应该使用而不是
QString maxString(const QString s, int len)

//这里是第二个例子。
QString maxString(const QString& s, int len) {
        if (s.size() < len) return s;
        else return s.left(len)+"...";
    }



    void showTree(QTextStream& out, const QDomNode& node, const int intent) {
        QString text;
        if (node.nodeType() == QDomNode::ElementNode) {
            ...
            }

        } else if (node.nodeType() == QDomNode::TextNode) {
            text = node.nodeValue().trimmed();
            if (text.isEmpty()) return; // keine Ausgabe leerer Textknoten
            text = "#text: "+maxString(text, 20);
        }
       ...

    }

最佳答案

声明变量时使用的&与在代码中使用时的&i不同(我指的是运行的部分)。

在运行代码中,可以理解为“的地址”。所以

int i = 7;
std::cout << i; // output: 7
std::cout << &i; // output: 0x7fff2af8900 (or any other, mostly random, hex number)
int i[4];的数字输出是一个地址,用于存储变量。变量的地址可以通过多种方式使用(大多数情况下称为指针算术)。例如,根据语言的定义,内存中的数组按顺序连续存储。因此,4定义了int i[1]的数组,它们像盒子一样彼此相邻地存储在内存中。您可以使用i触摸该数组的第二个成员,并且[](不带i == &i[0])将地址保留到第一个成员。
因此,bool check_validity(LargeData data)对于数组始终为true。

但是,声明中的称为引用。
int value = 7;
int& ref = value; // with this, you can look at value using ref variable
value = 8;
std::cout << ref; // output: 8

编辑:
调用带有参数的函数时,将复制其所有参数,并且您的函数将使用其自己的数据。如果您有函数,看起来像LargeData,它将以某种方式处理大量的true,然后在数据有效的情况下返回false,否则返回LargeData。您实际上是将整个数据复制到该函数中。从该函数返回后,副本将丢失。现在,复制非常昂贵(时间),如果您不需要该副本,为什么还要复制。如果您使用引用传递LargaData&包(例如const LargeData&或更好的8Bytes以禁用不必要的修改),则只有实际复制的东西才是常量的指针(很可能是QString maxString(const QString& s, int len)),而不是整个数据(可能是10MB或500GB甚至更多) )。

因此,关于代码s的存在只是因为您不想只花一些时间复制myDoc.setContent(&file, &errorMsg, &errorLine)输入变量。

现在,file可能是一些函数(使用一些规则)填充true并返回errorMsg(如果成功),否则返回false(如果为false),并且还向errorLine和ojit_code填充失败的一些信息。但是,我们如何定义该函数,以便可以拥有那么多输出变量。容易,我们将变量的地址传递给该函数,并将其写入该地址。

09-04 07:45