引用类型变量初始化和存储



这合法吗?

int& foo = 0x00000000;

我不知道'int'是否是正确的数据类型。如果你想存储一个地址,你会使用什么数据类型?还是必须用指针?

除此之外,这合法吗?

int foo = 5;
int bar = &foo;

本质上我想问的是,有没有一种不使用指针来存储地址的方法?

如果你想存储一个地址,你会使用什么数据类型?还是必须用指针?

对于存储地址,通常使用指针。如果你不知道是什么原因要将指针存储在整型中,你可以这样做,前提是整型足够大,可以容纳指针(64位整数对应64位指针等)。

c++ 03 AFAIK仍然没有(或保证)足够大的整型来保存指针,但C99引入了intptr_t typepedef,这正是为了这个目的。c++ 11也有(std::intptr_t在头文件<cstdint>中)。

你可以这样使用:

int x;
intptr_t i=(intptr_t)&x;

或更好

intptr_t i=reinterpret_cast<intptr_t>(&x);

注意i中的值是实现定义的

这合法吗?int&

这合法吗?Int foo = 5;Int bar = &foo;

。为了将指针转换为整型,需要强制类型转换:reinterpret_cast< int >( &foo )。您可能需要int* bar = &foo;

是否有一种不使用指针存储地址的方法?

不,指针是用来存储地址的元素。你可以把它们转换成一个足够长的整数,然后你就可以"存储"伪装成数字的地址。

引用不是地址,事实上引用什么都不是。

int& foo = 0x00000000;试图引用字面量,这将不起作用,因为字面量是常量。

const int& foo = 0x00000000;

创建一个对常量整数0的引用。当你试图在你的代码中使用foo时,它将是0。

引用通常由编译器实现为指针,但这是一个实现细节,应该对您不可见。

指针是为了存储地址而发明的,不使用它的唯一原因是使用智能指针类来代替。

第二个代码段非常好。可能可以编译,但可能不符合您的要求。第一个是荒谬的。

如果你想声明一个int型的指针,它是int *foo

你可以这样做:

int foo = 5;
int *bar = &foo;

有了这样的声明,这就是你能做的和不能做的:

*bar = 6; // foo is now 6.
bar = 6;  // bar now points to the blackness of space
*bar = 6; // Seg fault!

第一个代码片段,

int& foo = 0x00000000;

是违法的;不能用临时对象初始化引用,除非它是const的引用。以下是合法的:

int const& foo = 0x00000000;

,但我想不出任何人想要这样做的理由。它是实际上就相当于:

extern int const foo = 0x00000000;
第二个代码片段,
int foo = 5;
int bar = &foo;

也是非法的。&foo的类型是int*,没有隐式int*int的转换。可以使用显式转换(reinterpret_cast),但前提是int足够大,可以容纳所有可能没有丢失的指针值。在这种情况下,最好使用intptr_t(来自<stdint.h>),它是对整型的类型定义大到足以容纳所有指针值。(正式:<stdint.h>是在C90/c++ 11中引入的,并且不能保证intptr_t存在如果没有一个足够大的整型。然而,C90/c++ 11需要long long,并要求它是64位的,所以这将只是一个如果您的机器的地址空间超过2 <一口> 64 吃饭。这不是我担心的。

最新更新