C指向数组的最后一个元素

时间:2017-07-12 13:58:21

标签: c arrays pointers sizeof

让我们说我们有一个数组

int a[4];

有一个巧妙的技巧,使用指针算术来找到最后一个元素。据我所知,它使用了'a'的地址并递增它,以便它会在数组之后立即指向然后返回一个位置。 增量背后的想法是有一个隐含的sizeof被完成。没有任何明确的sizeof

任何人都知道它是如何完成的?

非常感谢!

2 个答案:

答案 0 :(得分:3)

我可以建议以下解决方案

#include <stdio.h>

int main( void )
{
    int a[4] = { 0, 1, 2, 3, };

    int *p = (int *)(&a + 1) - 1;

    printf("*p = %d\n", *p);

    return 0;
}

程序输出

*p = 3

答案 1 :(得分:3)

您可能正在考虑涉及&a + 1的内容,它是指向结构末尾的内存的指针。

但是,(&a)[1][-1]或相同的表达式,但用数字表示法*(&a + 1))[-1]*(*(&a + 1) - 1)替换指针表示法,是technically undefined behaviour。但是有人可能会把它写成一个“聪明的伎俩”而没有意识到它是未定义的。

((int *)(&a + 1))[-1]定义明确并完成了工作,虽然可以说比阅读直接代码更难阅读。