c++ - 为什么有人告诉我数组是指针? C++中数组和指针的关系是什么?

标签 c++ arrays pointers

我的背景是 C++,目前我正准备开始使用 C# 进行开发,所以我正在做一些研究。然而,在这个过程中,我遇到了一些关于 C++ 的问题。

C# for C++ developers guide说是

In C++ an array is merely a pointer.

但是this StackOverflow question有一条高度评价的评论说

Arrays are not pointers. Stop telling people that.

cplusplus.com page on pointers说数组和指针是相关的(并提到隐式转换,所以它们显然相同)。

The concept of arrays is related to that of pointers. In fact, arrays work very much like pointers to their first elements, and, actually, an array can always be implicitly converted to the pointer of the proper type.

我的印象是 Microsoft 页面想要简化事情以总结 C++ 和 C# 之间的差异,并且在这个过程中写了一些更简单但不是 100% 准确的东西。

但是数组首先与指针有什么关系呢?为什么关系密切到足以将他们概括为“相同”,即使他们不是?

cplusplus.com 页面说数组“像”指向其第一个元素的指针一样工作。如果它们实际上不是指向其第一个元素的指针,那意味着什么?

最佳答案

那里有很多糟糕的写作。例如语句:

In C++ an array is merely a pointer.

是错误的。怎么会写出这么烂的文章呢?我们只能推测,但一种可能的说法是,作者使用编译器通过反复试验学习了 C++,并根据他的实验结果形成了错误的 C++ 心智模型。这可能是因为 C++ 对数组使用的语法是非常规的。

下一个问题是,学习者如何知道他/她读的是好 Material 还是坏 Material ?当然,除了阅读我的帖子 ;-) 之外,参与像 Stack Overflow 这样的社区有助于让你接触到许多不同的演示和描述,然后在一段时间后你有足够的信息和经验来做出自己的决定哪个写得好,哪个写得不好。

回到数组/指针主题:我的建议是,当我们在 C++ 中工作时,首先建立一个关于对象存储如何工作的正确心智模型。仅仅为这篇文章写的可能太多了,但这是我从头开始构建它的方法:

  • C 和 C++ 是根据抽象内存模型设计的,但是在大多数情况下,这直接转换为系统操作系统或更低层提供的内存模型
  • 内存被划分为称为字节的基本单元(通常为8位)
  • 可以分配内存作为对象的存储;例如当您编写 int x; 时,决定留出一个特定的相邻字节 block 来存储整数值。 对象 是分配存储的任何区域。 (是的,这是一个稍微循环的定义!)
  • 分配存储的每个字节都有一个地址,它是一个标记(通常表示为一个简单的数字),可用于在内存中找到该字节。对象中任何字节的地址都必须是连续的。
  • 名称x 只存在于程序的编译阶段。在运行时,可以分配从未有名称的 int 对象;并且在编译期间可以有具有一个或多个名称的其他 int 对象。
  • 所有这些都适用于任何其他类型的对象,而不仅仅是 int
  • 一个数组是由许多相同类型的相邻子对象组成的对象
  • 指针 是一个对象,用作标识可以找到另一个对象的位置的标记。

从这里开始,C++ 语法就进入了它。 C++ 的类型系统使用强类型,这意味着每个对象都有一个类型。类型系统扩展到指针。几乎在所有情况下,用于存储指针的存储只保存被指向对象的第一个字节的地址;并且在编译时使用类型系统来跟踪指向的内容。这就是为什么我们有不同类型的指针(例如 int *float *),尽管在这两种情况下存储可能包含相同类型的地址。


最后:所谓的“数组指针等价”不是存储的等价,如果你理解我最后两个要点的话。它是查找数组成员的等效语法。

既然我们知道指针可以用来寻找另一个对象;数组是一系列许多相邻的对象;然后我们可以通过使用指向该数组第一个元素的指针来使用该数组。等价的是相同的处理可以用于以下两个:

  • 找到数组的第 N 个元素
  • 在内存中找到我们正在查看的对象之后的第 N 个对象

此外,这些概念都可以使用相同的语法来表达。

关于c++ - 为什么有人告诉我数组是指针? C++中数组和指针的关系是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26517164/

相关文章:

c - 将指针分配给链表: does not contain data

c - 在 C 中初始化 struct typedef 数组?

c - 使用 openGL 从 C 中的文件或指针打印值

c++ - eclipse CDT : How to use GCC C++ compiler on C sources?

arrays - 数组的最后一个元素匹配 scala

ruby-on-rails - 如何查询 Rails 4 中的数组列?

arrays - 在接收函数返回数组时执行错误的过量操作?

c++ - 运行时检查失败 #0 从 kernel32.dll 加载 QueryFullProcessImageName

c++ - 定义结构数组

c++ - 数组声明为 unsigned char 时的垃圾值