为什么不';有些语言不允许声明指针吗? 我现在正在用C++编程,我喜欢使用指针。但其他较新的语言,如Java、C#和Python,似乎不允许显式声明指针。换句话说,您不能同时编写int x和int*y,而x是一个值,而y是这些语言中的任何一种。这背后的原因是什么?

为什么不';有些语言不允许声明指针吗? 我现在正在用C++编程,我喜欢使用指针。但其他较新的语言,如Java、C#和Python,似乎不允许显式声明指针。换句话说,您不能同时编写int x和int*y,而x是一个值,而y是这些语言中的任何一种。这背后的原因是什么?,c++,pointers,C++,Pointers,指针并不坏,它们很容易出错。在较新的语言中,他们找到了做同样事情的方法,但射中自己脚的风险较小 不过指针没有什么问题。去爱他们吧 对于您的示例,为什么希望x和y都指向同一个内存?为什么不总是叫它x呢 还有一点,指针意味着您必须自己管理内存生命周期。较新的语言更喜欢使用垃圾收集来管理内存,允许使用指针会使这项任务变得非常困难。指针可能被滥用,而托管语言更喜欢保护您免受潜在陷阱的影响。然而,指针当然不是坏事——它们是C语言和C++语言的一个整体特征,而没有它们编写C/C++代码既麻烦又麻烦。 当我谈

指针并不坏,它们很容易出错。在较新的语言中,他们找到了做同样事情的方法,但射中自己脚的风险较小

不过指针没有什么问题。去爱他们吧

对于您的示例,为什么希望x和y都指向同一个内存?为什么不总是叫它x呢


还有一点,指针意味着您必须自己管理内存生命周期。较新的语言更喜欢使用垃圾收集来管理内存,允许使用指针会使这项任务变得非常困难。

指针可能被滥用,而托管语言更喜欢保护您免受潜在陷阱的影响。然而,指针当然不是坏事——它们是C语言和C++语言的一个整体特征,而没有它们编写C/C++代码既麻烦又麻烦。 当我谈论异常处理时,我教给人们两件事:

  • 指针是你的敌人,因为它们会导致
    auto_ptr
    设计用来消除的各种问题

  • 指针是您的朋友,因为指针上的操作不能抛出

然后我告诉他们祝他们有一个愉快的一天:-)


要点是指针非常有用,在C++编程时,理解它们是必要的。在不理解指针的情况下,你无法理解C++内存模型。当您实现一个资源拥有类(例如,智能指针)时,您需要使用指针,并且您可以利用它们的无抛出保证来编写异常安全的资源拥有类

但是,在编写良好的C++应用程序代码时,您不应该使用原始指针。从未。您应该始终使用某种抽象层,而不是直接使用指针:

  • 尽可能使用引用而不是指针。引用不能为null,它们使代码更易于理解、编写和查看

  • 使用智能指针管理您确实使用的任何指针。像
    shared_ptr
    auto_ptr
    unique_ptr
    这样的智能指针有助于确保您不会过早泄漏资源或释放资源

  • 使用标准库中的容器来存储对象集合,而不是自己分配数组。通过使用像
    vector
    map
    这样的容器,可以确保代码是异常安全的(这意味着即使抛出异常,也不会泄漏资源)

  • 使用容器时使用迭代器。正确使用迭代器要比正确使用指针容易得多,而且许多库实现提供了调试支持,帮助您找到错误使用迭代器的地方

  • 当您使用遗留或第三方API时,您绝对必须使用原始指针,请编写一个类来封装该API的使用

C++以范围限制资源管理(SBRM,也称为资源获取是初始化,或RAII)的形式进行自动资源管理。使用它。如果你不使用它,那就是你做错了。

一个真正的“指针”有两个特点

  • 它保存另一个对象(或原语)的地址
    • 并公开该地址的数字性质,以便进行算术运算
通常,为指针定义的算术运算包括:

  • 向数组中的指针添加一个整数,该数组返回另一个元素的地址
  • 将两个指针相减到同一数组中,返回中间的元素数(包括一端)
  • 将两个指针比较到同一数组中,这表明哪个元素更靠近数组的头部
  • 托管语言通常引导您走向“引用”而不是指针。引用还保存另一个对象(或原语)的地址,但不允许使用算术

    除此之外,这意味着您不能使用指针算法离开数组的末尾,并使用错误的类型处理其他一些数据。另一种形成无效指针的方法是在这样的环境中使用垃圾收集


    总之,这确保了类型安全,但却严重丧失了通用性。

    我试图直接回答OP的问题:

    换句话说,你不能两者都写 int x和int*y,并且x是a 值,而y是指针 那些语言。原因是什么 在这背后


    这背后的原因是这些语言中的托管内存模型。在C#(或Python,或Java,…)中,资源的生命周期以及内存的使用都是由底层运行时自动管理的,确切地说是由它的垃圾收集器自动管理的。简单地说:应用程序无法控制资源在内存中的位置。它没有指定,甚至不能保证在资源的生命周期内保持不变。因此,指针作为“虚拟或物理内存中某物的位置”的概念是完全不相关的

    正如有人已经提到的,如果您有一个大型应用程序,指针可能会出错,实际上也会出错。这是我们有时看到Windows由于创建空指针而出现问题的原因之一!我个人不喜欢指针,因为它会导致严重的内存泄漏,并且没有ma