我是编程新手,但在学习指针之后,我想知道我们是否真的需要它们?为什么我们不能将变量的地址存储在数据类型中,例如ints?
答案 0 :(得分:5)
实际上,典型的现代CPU架构的“机器语言”将指针/地址视为普通的旧整数。您将它们存储在整数寄存器中(而不是浮点寄存器),并使用整数指令对它们进行操作。 是例外:MC68000有单独的“地址”和“数据”寄存器,而且一些微控制器也有这种区别,但现在这种情况很不寻常。并且有一些计算机体系结构指针根本不是整数,比如iAPX 432,但那些更不寻常。
更高级语言中指针类型的原因是type checking。如果你告诉编译器变量i
应该只是一个数字,变量p
应该保存一些数据块的地址,依此类推,它可以检测到一些(不是全部) ,唉)你在使用这些变量时犯了错误的情况。让编译器为您找到错误是一个非常有用的功能,整个编程语言都是围绕它设计的,例如: ML和Rust。
答案 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]