为什么我被告知数组是一个指针? C中数组和指针之间的关系是什么?

我的背景是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.

我得到的印象是,微软页面想简化一些事情,以便总结C和C#之间的差异,并在此过程中编写了一些更简单但不是100%准确的东西.

但是阵列首先与指针有什么关系呢?为什么这种关系足够接近他们被概括为“相同”,即使他们不是?

cplusplus.com页面说数组“就像”指向第一个元素的指针.这意味着什么,如果他们实际上并不指向他们的第一个元素?

那里有很多糟糕的写作.例如声明:

In C++ an array is merely a pointer.

简直是假的.这样糟糕的写作怎么会出现?我们只能推测,但一种可能的理论是作者使用编译器通过反复试验来学习C,并根据他的实验结果形成了一个错误的C心理模型.这可能是因为C用于数组的语法是非常规的.

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

回到数组/指针主题:我的建议是首先建立一个正确的心理模型,说明当我们在C中工作时对象存储的工作方式.仅仅针对这篇文章写的可能太多了,但是我将从头开始构建它:

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

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

最后:如果您理解我的最后两个要点,那么所谓的“数组指针等价”并不是存储的等价物.它是查找数组成员的语法等价物.

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

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

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

https://stackoverflow.com/questions/26517164/why-am-i-being-told-that-an-array-is-a-pointer-what-is-the-relationship-between

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:为什么我被告知数组是一个指针? C中数组和指针之间的关系是什么?