【问题标题】:What does each depointer/dereference syntax make the variable mean?每个 depointer/dereference 语法使变量意味着什么?
【发布时间】:2021-06-27 18:56:37
【问题描述】:

编辑:由于int * xint* xint *x 之间没有区别,我删除了该部分以更好地阐明我的困惑。

问题:

“指针”和“引用”的区别在What are the differences between a pointer variable and a reference variable in C++?的回答中有解释,但语法本身似乎根据上下文有不同的含义。

当声明一个指针或引用时,*& 修饰符使这些变量在以后意味着什么?它们是指针、原始值、对象引用等吗?

例如,因为这里的文字似乎让我失望:

void foo(int* x, int& y) {
    assert(*x == ??);
    assert(&x == ??);
    assert(*y == ??);
    assert(&y == ??);
}

【问题讨论】:

  • 也许你被语法中的一个怪癖弄糊涂了,它使得int * x,y; 声明一个int* 和一个int,或者我不知道是什么导致了你的困惑。无论如何,你把空白放在哪里并不重要
  • 但我无法找到一个明确的解释来解释在方法中使用这些修饰符声明变量时会发生什么 完全相同的事情。声明就是声明,不管它在哪里,它仍然遵循 C++ 的单一声明规则。
  • int* xint *x 相同与int * x 相同。引用 & 相同。
  • 你没有得到一个带有*x的指针和一个带有&x的引用,你得到一个带有*x的错误,因为你试图取消引用一个int,你得到一个带有@的指针987654339@ 因为&xx 的地址,而指针的值是地址。
  • "如果你有一个用int x声明的变量,你可以用*x得到指针,用&x得到引用"没有。如果你有一个指针int* x那么你可以通过value= *x; 获得这个指针指向的值。一个指针基本上就是一个地址。如果你有一个值x,那么你可以通过address= &x;得到它的地址

标签: c++ pointers memory syntax reference


【解决方案1】:

这个规则很简单。无论您在哪里看到声明,如果它在mainsome_namespace、类内部或函数的参数部分中,声明的含义相同。知道这一点,每当你看到

type_name * variable_name

您正在声明一个指针。随处可见

type_name & variable_name

您正在声明一个引用。这里的间距无关紧要,int* fooint * fooint *foo 都声明了一个名为int*foo。这里唯一棘手的一点是*& 适用于变量名,而不是类型。这意味着像

这样的代码
int * foo, bar;

foobar 不是两个指针。 foo 是一个指向 int 的指针,而 bar 只是一个 int。要制作barint,您需要使用

int * foo, * bar;

这会处理声明。

使用,如果你看到

*variable_name

然后你通过variable_name 间接(调用一元operator*)。如果你看到

&variable_name

那么你得到的是variable_name的地址,或者调用variable_name类型的operator&

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2023-03-10
    • 1970-01-01
    • 2021-11-04
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多