我正在学习引用,指针和变量。我想我已经迷失了自己。
在高层次上,我的理解是
*指针="积分"到内存中的位置
& reference =引用值
所以,这意味着
char* c; //pointer
char& c; //reference
char c; //does this not have a flash name? What is the prefix?
如果指针是"位置" (根据我上面的描述)并且引用是值,那么char c
是什么?都?或只是价值?我的测试只显示了值,所以如果这是真的,我们为什么要使用reference
?
EG,我为什么要用
void myFunction(int& size);
在
void myFunction(int size);
答案 0 :(得分:5)
让我为您的变量赋予唯一的名称,因此更容易讨论它们:
char a = 'x';
char& b = a;
char* c = &a;
在此示例中,a
是一个新框的名称,其中包含字符' x'的代码。存储在其中:
+-----+
a | 120 |
+-----+
b
只是同一个框的另一个名称:
+-----+
a | 120 | b
+-----+
最后,c
是包含指向第一个框的指针的框的名称:
+-----+
a | 120 | b
+-----+
^
|
+--|--+
c | | |
+-----+
答案 1 :(得分:2)
在C ++中,变量是不受约束的。变量本身可以是对象,也可以是绑定到对象的引用。在任何一种情况下,变量的值(即评估仅由变量名称组成的id表达式的结果)就是该对象。如果变量是一个对象,那么它的存储要么是自动的(对于非静态块局部变量),要么是静态/线程局部的。引用没有存储空间。变量的生命周期是其名称的生命周期;如果变量是一个对象,那么这也是对象的生命周期。
通常,每个(可破坏的)对象类型都可以是C ++中变量的类型。这与许多其他语言不同,其中变量被约束为某种“原始”类型,或者是对位于其他地方的对象的引用。
至于指针:指针并不特别,它们只是普通的对象,如浮点数或字符串。指针值具有某种含义的事实与整数值具有某种含义的事实没有什么不同。
答案 2 :(得分:0)
让我们从vector myVector={...million elements...};
开始。这样做是声明一个具有特定名称(myVector)和特定类型(字符串向量)的变量。
目前,我们实际上并不关心这个变量的存储方式/位置。
我们有一个方法接受字符串int calculate(vector vs) { }
的向量。
当我们调用calculate(myVector)
时,myVector VALUE被复制到函数内部,函数继续执行。
在这种情况下,我们只是没有充分理由复制了一百万个字符串的向量。通过指定计算对向量calculate(vector & vs)
进行参考,我们可以省略该副本并仅传递对向量的引用,而不是其实际值。
现在,引用可以被理解为myVector的“位置”,但这并不完全正确,因为这通常是一个实现细节,我们没有(我们不应该)担心实现细节。重点是我们传递“引用某事物”而不是“某事物”。
为什么不指针呢?通过使用指针,整个事情变得明确。我们表示方法接受存储字符串向量的存储位置。这在某些情况下可能有效(例如,您的方法接受空指针),但通常传递引用更清晰,更健壮。
重新盖上
vector myVector = {...values...};
=具有特定类型名称和值的变量
vector & myVector
=对字符串的现有向量的引用
vector * myVector
=指向字符串向量的指针
答案 3 :(得分:-1)
我认为 -
“char c”
只是一个声明,每次编译器编译代码时,它都会知道'c'是一个char。 现在,在为 c 分配值之后 - 如果您想从其他地方引用'c',您可以通过两种方式进行:通过引用或通过它指针。