我们知道数组的最后一个元素值或二维数组可以通过以下代码获得:
对于数组:
int a[] = {1, 2, 3, 4};
printf("%d", *((int *)(&a + 1) - 1));
对于二维数组:
int a[2][2] = {1, 2, 3, 4};
printf("%d", *((int *)(&a + 1) - 1));
这两个代码都可以输出正确的值:4。但是当我更改下面的代码时:
int foo(int a[][2]) {
return *((int *)(&a + 1) - 1);
}
void main() {
int a[2][2] = {1, 2, 3, 4};
printf("%d", foo(a));
}
然后我无法获得正确的价值。这段代码有什么问题吗?此代码的主要目的是在不知道元素数量的情况下尝试获取最后一个元素值。这可能吗? 提前谢谢。
答案 0 :(得分:0)
是。在前两种情况下,a
是一个数组。但是在最后一种情况下,a
是一个指针。您忘记了在函数参数中,数组声明符被调整为指针声明符。你的功能实际上是:
int foo(int (*a)[2])
{
其中a
是指向您调用函数的数组的第一个元素的指针。函数无法获取数组的维度(或执行需要该信息的任何操作)。
答案 1 :(得分:0)
将数组传递给函数时,它会衰减为指针。所以当做例如在函数中&a
,你没有得到一个指向2个整数数组的指针,你得到一个指向2个整数数组的指针。
答案 2 :(得分:-2)
我对C一无所知,但每种语言都有/应该有一个函数来检查数组的长度,主要是它的长度或模拟数。
所以,如果我想在php中得到最后一个元素,我会:
Var elmt = array[array.count-1]
我希望能够正确理解你想要的东西。