我不知道任何网站,但我会尝试用非常简单的术语来解释它.您只需要理解三件事:
variable将包含变量的内容.这意味着如果变量是指针,它将包含它指向的内存地址.*variable(仅适用于指针)将包含变量的内容指出.如果变量它指向的是另一个指针,ptr2,则*variable和ptr2将是同样的事情; **variable并且*ptr2也是一样的.&variable将包含变量的内存地址.如果它是一个指针,它将是指针本身的内存地址,而不是指向的变量或指向的变量的内存地址.现在,让我们看一个复杂的例子:
void **list = (void **)*(void **)info.List;
Run Code Online (Sandbox Code Playgroud)
list是指向指针的指针.现在让我们从结尾开始检查作业的正确部分:(void **)info.List.这也是指向指针的指针.
然后,你看到*: *(void **)info.List. 这意味着这是指针info.List指向的值.
现在,整件事:(void **)*(void **)info.List.这是指针info.List指向要转换为(void**)的值.
我发现右 - 右 - 右规则很有用.它告诉您如何读取声明,以便按顺序获取所有指针和引用.例如:
int *foo();
Run Code Online (Sandbox Code Playgroud)
使用右 - 右 - 右规则,您可以将其翻译为英语,因为"foo是一个返回指向整数的指针的函数".
int *(*foo)(); // "foo is a pointer to a function returning a pointer to an int"
int (*foo[])(); // "foo is an array of pointers to functions returning ints"
Run Code Online (Sandbox Code Playgroud)
右 - 右 - 右规则的大多数解释是针对C而不是C++编写的,因此它们倾向于省略引用.它们就像在这种情况下的指针一样工作.
int &foo; // "foo is a reference to an integer"
Run Code Online (Sandbox Code Playgroud)