一位朋友让我在C中编写一个函数来返回数组的第100个元素。我不是很熟悉C,所以我不知道如何制作一个可以用任何类型的数组做到这一点的泛型函数,所以我作弊并假设它是一个整数数组并编写了这个函数:
int GetHundredthElement(int *array) {
return array[100 - 1];
}
(- 1
就在那里,因为数组是零索引的)
我问他如何制作适用于任何类型数组的函数。他告诉我有一个简单的方法:
int GetHundredthElement = 100 - 1;
并且可以像这样调用这个“函数”:
GetHundredthElement[array];
我尝试了它,但它起作用了,但对我来说看起来不像是一个函数,因为它使用括号表示法,这不是用C语言编写函数调用的方式。我真的不明白这个代码到底是什么做或做它的方式。这是怎么回事?
答案 0 :(得分:11)
它不是一个函数,它只是利用一个鲜为人知的C事实,即数组索引可以互换。所有x[y]
符号实际上意味着您正在访问y数组的第x个偏移量。但是你可以轻松地在你的案例中写y[x]
并得到相同的结果。
99[array]
和array[99]
是可以互换的,意思相同。通过将GetHundredthElement声明为99,你的朋友玩了一个巧妙的技巧:)
然而,您可以使用 C ++ 模板(而不是C)编写一个通用函数来轻松获取数组的第100个元素。
答案 1 :(得分:9)
你对GetHundredthElement
不是函数的事实是正确的 - 正如你所料,它是一个整数。
然而,这说明了C中令人惊讶的能力,您可以在其中颠倒阵列访问的顺序!
assert(a[5] == 5[a]);
这是因为可以在指针算术中实现数组访问:
assert(a[5] == *(a+5));
assert(*(a+5) == *(5+a));
assert(*(5+a) == 5[a]);
答案 2 :(得分:5)
使用指针时,pointer[ index ]
和index[ pointer ]
实际上是相同的。它不是一个功能,它是一个常规的操作员;与array[ GetHundredthElement ]
或array[ 100 - 1 ]
相同。
答案 3 :(得分:2)
这是您可以访问数组的特殊时髦方式。
让我们回想一下,数组可以像指针一样对待,你可以使用算术。
例如:
让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)
答案 4 :(得分:2)
在C中,括号表示法是指针算术的简写。像x[i]
这样的正常用法在语法上等同于*(x + i)
(请记住,数组是指针)。如果您使用了i[x]
,那么它与*(i + x)
相同并产生相同的输出。正如其他答案所指出的,这种方法不是一种功能,只是一种有趣的技术。