【发布时间】:2012-04-21 16:44:00
【问题描述】:
我最近尝试真正掌握 C++ 中的引用和指针,但我有点困惑。我了解* 和& 运算符,它们可以分别获取一个地址的值并获取一个值的地址,但是为什么不能简单地将它们与ints 等基本类型一起使用?
我不明白为什么你不能,例如,做如下的事情而不使用任何奇怪的指针变量创建:
string x = "Hello";
int y = &x; //Set 'y' to the memory address of 'x'
cout << *y; //Output the value at the address 'y' (which is the memory address of 'x')
理论上,我认为上面的代码应该输出“x”的值。 'y' 包含'x' 的内存地址,因此'*y' 应该是'x'。如果这可行(顺便说一下,在尝试编译它时,它不会——它告诉我它不能从字符串转换为 int,这没有多大意义,因为你认为内存地址可能是存储在 int 中)。
为什么我们需要使用特殊的指针变量声明(例如string *y = &x)?
在这里面,如果我们在上面一行的例子中的指针声明中使用*运算符,我们将'y'的值设置为'x'的内存地址,但是稍后当我们想要访问内存地址 ('&x') 处的值,我们可以使用之前设置为内存地址的相同 '*y'。
【问题讨论】:
-
您不能取消引用
int变量,因此未定义*y。 -
如果您认为内存地址应该可以存储在
int中会很有趣 - 鉴于在某些 64 位平台(具有 64 位地址空间)上,int定义为 32 位整数。 -
@Damien_The_Unbeliever:然后将问题改写为“为什么不在任何地方使用
intptr_t?”或“为什么不到处使用void*?”。他想知道为什么所有不同的指针类型都是必要的。 -
@BenVoigt - 我认为这里有两个独立的概念 - 1)为什么指针应该被认为与整数不同,以及 2)为什么指向不同类型的指针不同。这两个想法/概念都值得探索。
-
@Damien:
void*和intptr_t没有太多理由分开。你陷入了大小的问题,但是有指针大小的整数,所以这更多的是为什么int和intptr_t的大小不同,与指针或这个问题无关。