关于指针和引用语法

New*_*lls 3 c c++

令人尴尬虽然我可能知道我并不是唯一有这个问题的人.

我多年来一直在使用C/C++.我从来没有遇到过解决地址,指针,指针和引用的概念的问题.

然而,我经常发现自己绊倒用C语法表达它们.不是像声明或解除引用这样的基础知识,而是更常见的事情,比如获取指向指针的地址,或指向引用的指针等等.基本上任何超出规范的间接级别或两个级别.通常我会遇到各种运算符的半逻辑组合,直到我找到正确的运算符.

显然,在某条线上,我错过了一两条规则,简化并使一切都落到了位置.所以我想我的问题是:你是否知道一个网站或参考资料,它清晰而深入地涵盖了这个问题?

Tho*_*ini 7

我不知道任何网站,但我会尝试用非常简单的术语来解释它.您只需要理解三件事:

  1. variable将包含变量的内容.这意味着如果变量是指针,它将包含它指向的内存地址.
  2. *variable(仅适用于指针)将包含变量的内容指出.如果变量它指向的是另一个指针,ptr2,则*variableptr2将是同样的事情; **variable并且*ptr2也是一样的.
  3. &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**)的值.


Adr*_*thy 5

我发现右 - 右 - 右规则很有用.它告诉您如何读取声明,以便按顺序获取所有指针和引用.例如:

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)

  • 这使一些事情变得简单.我想要一个指针的引用,但不记得语法,是`int&*ptr`还是`int*&ptr`?从右到左阅读,"ptr是指向int的指针的引用",第二个显然是正确的. (2认同)