作者(Bjarne Stroustrup)在他的书“ The C ++ Programming Language”(第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_Ref
的类型为float&
(float
变量Var
的别名)Var_ptr
的类型为float*
(指向具有Var
类型的变量float
的指针)特别是对于指针,该指针在打印时显示存储位置的整数十六进制值。
问:这些是真实数据类型吗?我想念什么吗?
最佳答案
不,这些仍然是真实的数据类型。
指针指向内存中的地址空间。例如,
int test = 5;
int *foo = &test;
&将获得测试所在的地址。 * foo只是声明foo将存储地址。
考虑到这一点,foo不会= 5,而是一些十六进制地址,例如0xA000125BFFFFFF或类似的东西。
如果这样做有帮助,有些人喜欢写:
int* foo
因此,您可以将其视为称为foo的int指针。
但是,需要指出的是,所有这些都是int类型。这将适用于另一种数据类型,例如float或double或某些其他自定义类型。
但是,要注意的一件事是您不能执行以下操作:
double test = 5.02;
int *foo = &test;