【发布时间】:2012-09-22 11:40:58
【问题描述】:
我在 SO 上经常看到这个问题。也许不是这么多话......但一次又一次地混淆了数组与指针的不同之处。所以我想我会花点时间来问答一些关于这个的问题。
出于本问答的目的,我们将假设一个 32 位系统,并声明了以下内容:
char * ptr = "hello";
char arr[10] = "hello";
int iarr[10] = {0};
以下是我在 SO 上看到的困惑的问题列表。当我看到新的问题时,我会添加到我的问答列表中(其他人也可以随意添加,如果您发现任何错误,请纠正我!)
- 指针和数组不是基本一样吗?
- 跟进:
*(ptr)和*(arr),或ptr[0]和arr[0]给出相同的结果,为什么? -
arr和&arr怎么是同一个值? - 跟进:为什么我打印
arr+1和&arr+1得到不同的值?
【问题讨论】:
-
@Prætorian - 这绝对是一个很好的链接,我认为这是分开的唯一原因是它是 C++ 特定的。我的目标是 C(因此是标签)和新程序员,我不想将事情与模板以及 C++ 和 C 之间的差异混淆。
-
请对不赞成票发表评论。我很乐意收拾东西,但让我们讨论一下你不喜欢的东西吧!谢谢。
-
你错过了一半的图片。您唯一考虑的是静态声明的数组。还有一种; 动态声明的数组。这些是使用变量表达式作为大小参数声明的数组类型,也是传递给函数的类型。在使用
&运算符和sizeof()函数时,动态声明的数组的行为也类似于指针。还值得注意的是,当你将静态数组传递给函数时,它会被转换为动态数组,或者换句话说,将地址复制到指针中。 -
@Zistack:动态数组是一个概念性的东西,没有语言方面的想法。动态数组被认为是语言级别的指针。
标签: c arrays pointers dereference memory-address