Closed. This question needs details or clarity。它当前不接受答案。
想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。
5年前关闭。
Improve this question
如果有人简单地向我解释了何时应该使用&运算符,如何识别/理解我,我将不胜感激。
作为引用:
和
但是对我来说一切都太抽象了。
例如这里:
当我们在主函数中生成整数时,为什么是
假?
//这里是代码行->
以及例如在这里如何被认可,
应该使用而不是
//这里是第二个例子。
因此,
但是,声明中的称为引用。
编辑:
调用带有参数的函数时,将复制其所有参数,并且您的函数将使用其自己的数据。如果您有函数,看起来像
因此,关于代码
现在,
想改善这个问题吗?添加详细信息,并通过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