这合法吗?
int& foo = 0x00000000;
我不知道'int'是否是正确的数据类型。如果您想存储地址,您将使用哪种数据类型?或者你必须使用指针吗?
除此之外,这是合法的吗?
int foo = 5;
int bar = &foo;
基本上我要问的是,有没有一种方法可以在不使用指针的情况下存储地址?
答案 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 。这不是我担心的事情。)