为什么我们不能只使用int数据类型来存储地址?

时间:2017-11-08 16:12:35

标签: c

我是编程新手,但在学习指针之后,我想知道我们是否真的需要它们?为什么我们不能将变量的地址存储在数据类型中,例如ints?

2 个答案:

答案 0 :(得分:5)

实际上,典型的现代CPU架构的“机器语言”将指针/地​​址视为普通的旧整数。您将它们存储在整数寄存器中(而不是浮点寄存器),并使用整数指令对它们进行操作。 例外:MC68000有单独的“地址”和“数据”寄存器,而且一些微控制器也有这种区别,但现在这种情况很不寻常。并且有一些计算机体系结构指针根本不是整数,比如iAPX 432,但那些更不寻常。

更高级语言中指针类型的原因是type checking。如果你告诉编译器变量i应该只是一个数字,变量p应该保存一些数据块的地址,依此类推,它可以检测到一些(不是全部) ,唉)你在使用这些变量时犯了错误的情况。让编译器为您找到错误是一个非常有用的功能,整个编程语言都是围绕它设计的,例如: MLRust

答案 1 :(得分:1)

除了zwol的回答之外,还有一些用户友好的论点:

请考虑以下代码:

SomeReallyComplexClass myObj;
int myObjPtr = &myObj;

这里,你有一个整数指针,但在告诉你如何使用它时没用。会员有什么作用?你能用它做什么?你怎么知道它是否真的是指针?我们现在可以看到它指向一个SomeReallyComplexClass对象,但是如果你看不到那个定义行(也许是因为它在另一个文件中),你就不得不追逐它。相反,使用指针类型,您可以立即知道指针另一端的内容:

SomeReallyComplexClass* myObjPtr = &myObj;
myObjPtr->doSomething();

要生成的下一个参数是指针算术。我们有一个数组:

char myArray[10];
int myArrayPtr = myArray; // Arrays in C/C++ are actually pointers to the first element in the array
*myArrayPtr; // = myArray[0]
*(myArrayPtr+1); // = myArray[1]

但是我们可以说数组现在的类型超过一个字节长:

SomeReallyComplexClass myArray[10];

现在,如果你做*(myArrayPtr+1),结果将是来自对象内部成员的一些数据字节,这实际上不是你想要的。

你仍然可以模仿这样的正确行为:

*(myArrayPtr + sizeof(SomeReallyComplexClass)); // = myArray[1]

但是,当你能做到这一点时,为什么还要烦恼:

SomeReallyComplexClass* myArrayPtr = myArray;
*myArrayPtr; // = myArray[0]
*(myArrayPtr+1); // = myArray[1]