【问题标题】:What are the similarities between {c++} Vertex* myList and {java} List myList?{c++} Vertex* myList 和 {java} List myList 有什么相似之处?
【发布时间】:2019-05-03 00:03:53
【问题描述】:

对于你们中的一些人来说,这个问题可能有点不言自明,但我真的想了解:List myList = new ArrayList<Vertex>(); { In JAVA } 和 Vertex* myList = new Vertex[size] {In C++} 之间的相似之处。 Java 中不存在的 C++ 中的 * 有什么意义。我知道它指向列表的第一个元素..我们什么时候应该使用*?它只是用于向量还是?

【问题讨论】:

  • Vertex* myList = new Vertex[size] 已替换为 std::vector<Vertex> myList(size)。听起来你可以使用good C++ book
  • Vertex* myList 表示 myList 是指向 Vertex 的指针(因为标准 C 数组存储为指向第一个元素的指针)。 tutorialspoint.com/cplusplus/cpp_pointers.htm
  • 认为Java ArrayList 就像一个数组是错误的。它们是两种截然不同的东西。
  • @AndyTurner 我不会说它们如此不同以至于无法进行比较,但这绝对是一个不好的例子。不过,我认为这个问题更像是“什么是指针?”而不是关于数组的问题。
  • 在 go 的类型语法的描述中有一个有趣的东西解释了*:虽然我们倾向于写Vertex* myList,但最初的意图是写Vertex *myList,意思是“ *myList 的类型是 Vertex"。由于* 取消引用指向其类型的指针类型,这意味着myList 是指向Vertex 的指针。这有点迂回,但显然,这是符号出现的地方。

标签: java c++ pointers


【解决方案1】:

当这两种语言有不同的假设时,我们不能谈论相似之处/不同之处。

在 Java 中,一切都是引用 - 您正在创建对象,它们被存储在某个地方(在堆栈/堆上),但您只能通过引用访问它们。这意味着在myList 中将保留ArrayList 实例的地址(真实实例 - 在内存中)

在 C++ 中,您可以将对象作为对象访问(具有所有后效,例如在将作为参数传递给函数时复制整个对象),也可以通过引用访问(使用指针 - 只是为了避免这种后效,但也可以使用一些特殊的礼物给像迭代内存单元这样的指针)。

是的 - 关于迭代计算机内存 - C++ 中有趣的事实是它分配 固态内存块(我的意思是 - 行中的下一个 N 个单元/地址)将数组放在那里 - 这就是为什么你可以将你的数组声明为

int* a = new int[100]; // this is called dynamic allocation

因为您需要的是第一个元素的地址和对象大小(由指针类型给出)。您只需执行以下操作即可跳转到下一个元素

a++

要区分使用对象/指针,您需要(或不需要)asterix 运算符*,这就是它出现在 C++ 中的原因。

另请阅读What exactly is the purpose of the (asterisk) in pointers?

【讨论】:

  • 哦,好吧。但是在 C++ 中哪一个更好,通过引用访问还是通过对象访问?
  • 实际上,当涉及到数组时,您只能将它们作为指针访问 - 即使您将数组声明为数组(我的意思是 int a[100]),它仍然会被发送到函数并保存在 a 下变量作为第一个元素的指针 - 该限制是由于性能(尝试想象在函数调用时复制 100 万个元素)。当然,像 a[100]a++ 这样的解引用数组元素是一个对象,除非你在数组中保留另一个指针 - 为什么不
  • 哦,所以基本上每当我声明一个数组 int a[100] 时,c++ 必须为我将它复制到一个指针变量 int* a 中,这意味着额外的工作?
  • 这并不意味着额外的工作——我很确定它在编译过程中会被改变
  • 我从来没有检查过,但我真的不这么认为
猜你喜欢
  • 2015-08-16
  • 2023-02-24
  • 2011-08-11
  • 2020-05-17
  • 2017-02-19
  • 1970-01-01
  • 2011-08-11
  • 2016-01-14
  • 2011-12-11
相关资源
最近更新 更多