C++: dereference
整理自:
- [1] Thinking in C++。
- [2] Pointers
- [3] dereference的一种新译法:用引
- [4] C++ pointers – reference and dereference operators
- [5] Pointer Basics
其实 dereference 是个很简单的概念,只是这个单词的逻辑意义有点难搞,加上 reference 这个概念又来搅和……
0. Glossary
&
: Address-of operator; can be read simply as “address of”&foo
returns the address offoo
*
: Dereference operator; can be read as “value pointed to by”*bar
returns the data pointed bybar
- reference^([1]): 英语单词本义
- reference^([2]): 专指 C++ reference (类型)
An example of address-of operator:
#include <iostream>
using namespace std;
int dog, cat;
void f(int pet) {
cout << "pet id number: " << pet << endl;
}
int main() {
int i, j;
cout << "f(): " << &f << endl; // address of the function
cout << "dog: " << &dog << endl;
cout << "cat: " << &cat << endl;
cout << "i: " << &i << endl;
cout << "j: " << &j << endl;
}
// output:
/*
f(): 1
dog: 0x49b030
cat: 0x49b034
i: 0x22fe4c
j: 0x22fe48
*/
To define a pointer:
int a = 47;
int *ipa = &a;
To access a variable through a pointer, you dereference the pointer using the same operator that you used to define it, like this:
*ipa = 100;
Now a contains the value 100 instead of 47.
Reference^([2]) 的例子见 C++: pass-by-value / pass-by-pointer / pass-by-reference
1. dereference 第一种解读
首先要肯定的是:pointer 也是一种 reference^([1]),比如我们可以造句:
- The play is full of references to the political events of those days.
- A pointer stores a reference to some data. (参 [5])
第二,dereference 和 reference^([2]) 没有直接关系。顺便说一句:把 reference^([2]) 理解为 alias 也是一个不错的选择。
第三,de- 理解为 “解除”,比如:
- deice: 除冰
- deactivate
这么一来,dereference 就可以这么理解:
- pointer 是一种 reference^([1]),是一种间接访问
- dereference 就是 “解除间接访问”,也就是直接访问 pointer 所指向的 data
另外注意英语的用法是 “to dereference the pointer”,或者进一步说 “dereferencing a pointer to an int
yields an int
“,我们就不要再造一个 “to reference the data” 的概念了,越搞越麻烦。
2. dereference 第二种解读
根据 [3] 的理解,把 reference^([1]) 和 dereference 都看做 noun,于是有:
- pointer is a reference to data
- data is a dereference to pointer
de- 确实也有 reversal 的意思(”解除” 也可以理解为 “逆操作” 啊),不过这个解读我觉得有点绕,还不好解释 dereference 的 verb(解释成 to get the dereference to sth?)
另外看到 [3] 这篇文章让我确信:中文版,呵呵……
3. dereference 第三种解读
根据 [4],&
也可以称作 reference operator,这个命名有两大好处:
- 如果我们把 pointer 看做一种 reference^([1]),那么
&
就是统一了涉及 reference^([1]) 和 reference^([2]) 的两种用法,称其为 reference operator 再合适不过&foo
returns a pointer (reference^([1])) tofoo
int &foo = bar;
defines a reference^([2]) namedfoo
- 在 reference^([1]), i.e. pointer 的意义上,
&
和*
的确是反操作,如果&
叫 reference operator,那么*
自然就叫 dereference operator
画个表阐述下:
红蓝 CP,表示 “反操作” 关系的同时也表示这三个操作其实是联系非常紧密的;而 reference^([2]) 的 int &ra = a;
操作和这三个并没有太大关系,用灰色表示不相关。
Comments