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

指向数组最后一个元素的C指针,c,arrays,pointers,sizeof,C,Arrays,Pointers,Sizeof,假设我们有一个数组 inta[4] 使用指针算法找到最后一个元素有一个巧妙的技巧。据我所知,它使用了“a”的地址,并将其递增,这样它将在数组之后立即指向,然后返回一个位置。 递增背后的思想是有一个隐式的sizeof正在进行。没有任何明确的sizeof 有人知道是怎么做的吗 非常感谢 我可以建议以下解决方案 #include <stdio.h> int main( void ) { int a[4] = { 0, 1, 2, 3, }; int *p = (int

假设我们有一个数组

inta[4]

使用指针算法找到最后一个元素有一个巧妙的技巧。据我所知,它使用了“a”的地址,并将其递增,这样它将在数组之后立即指向,然后返回一个位置。 递增背后的思想是有一个隐式的
sizeof
正在进行。没有任何明确的
sizeof

有人知道是怎么做的吗


非常感谢

我可以建议以下解决方案

#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;
}

您可能正在考虑与
&a+1
有关的内容,它是指向刚过结构末尾的内存的指针

但是,
(&a)[1][1]
,或相同的表达式,但用指针表示法代替数组表示法,
*(&a+1))[-1]
*(*(&a+1)-1)
,是不正确的。但有人可能会把这写成一个“聪明的把戏”,却没有意识到这是一个未定义的把戏


((int*)(&a+1))[-1]
定义良好并能胜任这项工作,尽管可以说比编写简单的代码更难阅读。

可能类似于
*(&a+1)-1
(未经检查/测试,我怀疑这是否定义良好)参见我的问题:。简而言之,
*(&array+1)
调用UB。不清楚您的意思。没有“把戏”。(“技巧”在大多数情况下都是个坏主意。)@M.M
(int*)(&a+1)
cast有效吗?指针类型是不兼容的,我想……是否有充分的理由避免使用
sizeof()
?还是纯粹的学术问题?注:
int*
强制转换似乎可以根据“指向对象类型的指针可能会转换为指向不同对象类型的指针。如果生成的指针没有与引用类型正确对齐,则行为未定义。”C11§6.3.2.3 7。
*p = 3