1 minute read

整理自:

其实 dereference 是个很简单的概念,只是这个单词的逻辑意义有点难搞,加上 reference 这个概念又来搅和……


0. Glossary

  • &: Address-of operator; can be read simply as “address of”
    • &foo returns the address of foo
  • *: Dereference operator; can be read as “value pointed to by”
    • *bar returns the data pointed by bar
  • 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 就可以这么理解:

  1. pointer 是一种 reference^([1]),是一种间接访问
  2. 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,这个命名有两大好处:

  1. 如果我们把 pointer 看做一种 reference^([1]),那么 & 就是统一了涉及 reference^([1]) 和 reference^([2]) 的两种用法,称其为 reference operator 再合适不过
    • &foo returns a pointer (reference^([1])) to foo
    • int &foo = bar; defines a reference^([2]) named foo
  2. 在 reference^([1]), i.e. pointer 的意义上,&* 的确是反操作,如果 & 叫 reference operator,那么 * 自然就叫 dereference operator

画个表阐述下:

红蓝 CP,表示 “反操作” 关系的同时也表示这三个操作其实是联系非常紧密的;而 reference^([2]) 的 int &ra = a; 操作和这三个并没有太大关系,用灰色表示不相关。

Categories:

Updated:

Comments