这看起来不像是一个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,只是一种有趣的技术。