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

时间:2011-10-06 16:41:30

标签: c++

这合法吗?

int& foo = 0x00000000;

我不知道'int'是否是正确的数据类型。如果您想存储地址,您将使用哪种数据类型?或者你必须使用指针吗?

除此之外,这是合法的吗?

int foo = 5;
int bar = &foo;

基本上我要问的是,有没有一种方法可以在不使用指针的情况下存储地址?

5 个答案:

答案 0 :(得分:2)

  

如果您想存储一个地址,您会使用哪种数据类型?或者你必须使用指针吗?

对于存储地址,通常使用指针。如果你知道什么原因你将指针存储在一个整数类型中,你可以,只要整数类型足以容纳指针(64位指针的64位整数等)。

C ++ 03 AFAIK仍然没有(或保证)大到足以容纳指针的整数类型,但是C99引入了intptr_t typedef,这些服务器只是为了这个目的。 C ++ 11也有它(标题std::intptr_t中的<cstdint>)。

你这样使用它:

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

或更好

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

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

答案 1 :(得分:1)

  

这合法吗?   INT和放大器; foo = 0x00000000;

没有

  这是合法的吗?   int foo = 5;   int bar =&amp; foo;

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

  

有没有一种方法可以在不使用指针的情况下存储地址?

不,指针是用于存储地址的元素。您可以将它们转换为足够长的整数,然后您就可以“存储”伪装成数字的地址。

引用不是地址,实际上引用不是任何地址。它们只是现有对象的新名称。

答案 2 :(得分: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!

答案 3 :(得分:0)

int& foo = 0x00000000;正试图引用一个文字,因为文字是不变的,所以它不起作用。这虽然有效:

const int& foo = 0x00000000;

这将创建对常量整数0的引用。每当您尝试在代码中使用foo时,它将为0。

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

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

答案 4 :(得分:0)

第一个片段,

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>),这是一个整数类型的typedef 大到足以容纳所有指针值。 (正式:intptr_t是 在C90 / C ++ 11中引入,long long并不保证存在 如果没有足够大的整数类型。但是,C90 / C ++ 11需要{{1}},并要求它为64位,所以这只是一个 如果你的地址空间超过的机器有问题 2 64 。这不是我担心的事情。)