这合法吗?
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 吃饭。这不是我担心的。一口>