C 指向数组最后一个元素的指针
C pointer to last element of array
假设我们有一个数组
int a[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;
}
程序输出为
*p = 3
您可能正在考虑涉及 &a + 1
的内容,它是指向刚好超过结构末尾的内存的指针。
然而,(&a)[1][-1]
,或相同的表达式,但用指针表示法代替数组表示法,*(&a + 1))[-1]
或 *(*(&a + 1) - 1)
,是 。但是有人可能把它写成 "clever trick" 而没有意识到它是未定义的。
((int *)(&a + 1))[-1]
定义明确并且可以完成工作,尽管可以说比编写简单的代码更难阅读。
假设我们有一个数组
int a[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;
}
程序输出为
*p = 3
您可能正在考虑涉及 &a + 1
的内容,它是指向刚好超过结构末尾的内存的指针。
然而,(&a)[1][-1]
,或相同的表达式,但用指针表示法代替数组表示法,*(&a + 1))[-1]
或 *(*(&a + 1) - 1)
,是
((int *)(&a + 1))[-1]
定义明确并且可以完成工作,尽管可以说比编写简单的代码更难阅读。