"Arrays = Pointers"*心灵狂热*.许多年后:"实际上,他们没有"*心灵再次被吹走*

The*_*kle 2 c arrays

语境:

我在C中打开和关闭编程大约2年,然后发现它a[i]只是语法糖,*(a + i)因此相当于*(i + a)i[a].我的现实被颠倒了,很多都是"AHA!" 在接下来的几天学习和阅读之后出现了启示时刻("那就是为什么数组总是通过引用传递!"等).从那时起,我已经内化了指针/数组的等价并将其保持在我心中,所以想象一下,当我偶然发现这个名为"数组衰变"的东西时,这是多么可怕的震撼.这是典型的例子:

码:

#include <stdio.h>

int Length(int*);

int main () {
  int arr[100];
  printf("Length of array: %d\n",(int)(sizeof(arr)/sizeof(arr[0])));
  printf("Length of array: %d\n",Length(arr));
  return 0;
}

int Length(int arr[]) {
   return sizeof(arr)/sizeof(arr[0]);
}
Run Code Online (Sandbox Code Playgroud)

结果:

Length of array: 100
Length of array: 2
Run Code Online (Sandbox Code Playgroud)

题:

事实证明,C毕竟对数组有一些认识!在声明数组的main中,程序能够正确地报告它的大小.现在我想知道有多少数组语法只是指针操作的语法糖(之前我曾假设:所有这些).C实际上确实有数组,它们的局限性是什么?这个例子表明只要你在同一个函数中就可以获得它们的长度,你可以做些什么呢?在这种腐烂的事情发生之前你能走多远?

AnT*_*AnT 6

"旧"C语言中有两个运算符不触发数组类型衰减:sizeof运算符和一元运算&符.sizeof计算整个数组的大小(而不是指针大小),同时&返回指向数组类型的指针(不是指向指针类型的指针)._Alignof正如埃里克在评论中指出的那样,C99补充道.

有时还会提到另外一个上下文:使用字符串文字初始化char数组(即字符串文字不会衰减到指针).

也可以这样说:在对象上下文(AKA左值上下文)中,数组保留它们的"数组",而在值上下文(AKA右值上下文)中,它们会立即衰减为指针.

PS作为历史评论:C语言的祖先之一--B语言 - 确实将数组实现为物理指针,这意味着B中的每个数组实际上都是指向独立分配的内存块的指针.最初假设此实现也将转移到C.但是,C必须有struct类型.并且B型阵列使阵列成为struct对象的成员而产生了不必要的复杂性.他们会使struct对象的初始化struct变得非常重要,对象将变为不可复制的原始对象memcpy这在C中被认为是不可接受的.因此,阵列被重新设计成它们当前的形式.C数组不是指针,但它们仍然模仿来自B语言的祖父母的指针式行为,这常常使人们学习C语言.

(有关完整故事,请参见http://cm.bell-labs.com/cm/cs/who/dmr/chist.html.)

  • 和`_Alignof`. (3认同)