这看起来不像是一个function。 这是什么?

一位朋友让我在C中编写一个函数来返回一个数组的第100个元素。 我不是很熟悉C,所以我不知道如何制作一个可以用任何类型的数组做到这一点的generics函数,所以我作弊并假设它是一个整数数组并编写了这个函数:

int GetHundredthElement(int *array) { return array[100 - 1]; } 

- 1是因为数组是零索引的)

我问他如何制作一个适用于任何类型数组的函数。 他告诉我有一个简单的方法:

 int GetHundredthElement = 100 - 1; 

并且这个“function”可以这样调用:

 GetHundredthElement[array]; 

我尝试了它,但它起作用,但对我来说看起来不像是一个函数,因为它使用括号表示法,这不是函数调用是用C语言编写的。我真的不明白这个代码在做什么或如何它正在做它。 这里发生了什么?

你认为GetHundredthElement不是一个函数是正确的 – 正如你所料,它是一个整数。

但是,这说明了C中令人惊讶的能力,您可以在其中颠倒arrays访问的顺序!

 assert(a[5] == 5[a]); 

这是因为可以在指针算术中实现数组访问:

 assert(a[5] == *(a+5)); assert(*(a+5) == *(5+a)); assert(*(5+a) == 5[a]); 

它不是一个函数,它只是利用一个鲜为人知的C事实,即数组索引可以互换。 所有x[y]表示法的确意味着您正在访问y数组的第x个偏移量。 但你可以很容易地在你的情况下写y[x]并获得相同的结果。

99[array]array[99]是可以互换的,意思相同。 通过声明GetHundredthElement为99,你的朋友玩了一个巧妙的把戏:)

但是,您可以使用C ++模板(而不是C)编写一个通用函数来轻松获取数组的第100个元素。

使用指针时, pointer[ index ]index[ pointer ]实际上是相同的。 它不是一个function,它是一个常规的操作员; 它与array[ GetHundredthElement ]array[ GetHundredthElement ]相同。

这是您可以访问数组的特殊时髦方式。

让我们回想一下,数组可以像指针一样对待,你可以使用算术。

例如:

x成为一些任意数组:

 int x[4]; 

意味着访问x的第5个元素,即*(x+4)

内存布局的可怕例子:

 x -> [0][1][2][3][4] 

现在,你可以用C数组/指向块的指针做的奇怪的事情是用括号表示法翻转数字和变量。

 x[4] is equal to 4[x] 

因为他们分解为:

 *(x+4) and *(4+x) 

在C中,括号表示法是指针算术的简写。 像x[i]这样的正常用法在语法上等同于*(x + i) (记住数组是指针)。 如果您使用了i[x]那么它与*(i + x)相同并产生相同的输出。 正如其他答案所指出的,这种方法不是一种function,只是一种有趣的技术。