【问题标题】:C++ pointers and references data typeC++ 指针和引用数据类型
【发布时间】:2017-03-29 18:43:48
【问题描述】:

作者 (Bjarne Stroustrup) 在他的《C++ 编程语言》(第 4 版)一书中第 138 页说:

从这些类型中,我们可以使用声明符运算符构造其他类型:
§7.2 指针类型(如int∗
§7.3 数组类型(如char[]
§7.7 引用类型(如double&vector<int>&&

这让我有点困惑。

我对指针、数组和引用运算符有基本的了解,并且我知道它们与内存地址有关。

但如果我有这样的代码:

#include <iostream>
#include <typeinfo>
#include <conio.h>

using namespace std;

int main()
{
    float Var;

    float& Var_Ref = Var;

    float* Var_ptr;
    Var_ptr = &Var;

    cout << "\n\n Type of Var is " << typeid(Var).name();
    cout << "\n\n Type of Var_ptr is " << typeid(Var).name();
    cout << "\n\n Type of Var_Ref is " << typeid(Var).name();

    getch();

    cout << "\n\n\n";
} 

输出是:

我可以看到typeid.name() 返回的是与它们相关的类型,而不是变量本身的类型。

我想:

Var_Reffloat&amp; 类型(float 变量 Var 的别名)
Var_ptrfloat* 类型(指向具有 @987654337 的变量 Var 的指针@type)

特别是对于在打印时显示内存位置的整数十六进制值的指针。

:这些是真实的数据类型吗?我错过了什么吗?

【问题讨论】:

  • 您的代码中有 3 次 typeid(Var).name()。
  • 我认为这是简单的印刷错误。
  • @George 在底部的那个链接中有一个使用指向双精度指针的示例,它输出double*
  • @picklechips Ah derp,感谢您指出这一点 :-) 这是对引用类型的错误假设。* 请参阅 ref
  • 谢谢@TonyJ。过度聚焦。我花了 3 个小时在上面,却没有注意到我没有编辑粘贴的行。现在输出是有意义的。非常感谢。 :)。谢谢大家

标签: c++ pointers types reference


【解决方案1】:

不,这些仍然是真正的数据类型。

指针指向内存中的地址空间。例如,

int test = 5;
int *foo = &test;

& 将获取 test 所在的地址。 *foo 只是声明 foo 将存储地址。

考虑到这一点,foo 不会 = 5。而是一些十六进制地址,例如 0xA000125BFFFFFF 或类似的奇怪的东西。

如果这有帮助,有些人喜欢写:

int* foo

所以你可以把它想象成一个叫做 foo 的 int 指针。

但是,需要指出的一点是,所有这些都是 int 类型。这将适用于另一种数据类型,例如 float 或 double 或其他一些自定义类型。

但是,需要注意的一点是,您不能这样做:

double test = 5.02;
int *foo = &test;

【讨论】:

  • int* foo 不好,因为这让人认为int* foo, bar 有两个int 指针,实际上foo 是一个指针,bar 是一个int。
  • 我同意,我不一定建议这样做。我习惯于'int foo'。但是在其他人的一些代码中,我看到他们写了'int foo'。刚才在这里提了一下,希望OP能对这个话题有更好的理解
  • 公平,只是想把它放在桌子上。我曾在需要int* bar 风格的地方工作过,正因为如此,它让我发疯。
  • 该死,还在学习 cmets 部分。以上假设分别为int *fooint* foo
  • 我认为int* foo 不会导致混淆。事实上int* foo, bar; 的意思是int *foo; int bar; 与语言的其他部分不一致。几乎在其他任何地方,* 都是该类型的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 2013-11-06
  • 2022-11-25
  • 2015-02-13
  • 1970-01-01
相关资源
最近更新 更多